summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2017-12-06 11:22:19 -0600
committerDaniel Stone <daniels@collabora.com>2017-12-27 14:14:04 +0000
commit52609ddf79a96fee0465006e2c6339a3a5d23a87 (patch)
treeff49471c2b85b28352d8790da0e320afd45eca31 /src
parentconnection: Refactor out closure allocation (diff)
downloadwayland-52609ddf79a96fee0465006e2c6339a3a5d23a87.tar
wayland-52609ddf79a96fee0465006e2c6339a3a5d23a87.tar.gz
wayland-52609ddf79a96fee0465006e2c6339a3a5d23a87.tar.bz2
wayland-52609ddf79a96fee0465006e2c6339a3a5d23a87.tar.lz
wayland-52609ddf79a96fee0465006e2c6339a3a5d23a87.tar.xz
wayland-52609ddf79a96fee0465006e2c6339a3a5d23a87.tar.zst
wayland-52609ddf79a96fee0465006e2c6339a3a5d23a87.zip
connection: Clear fds we shouldn't close to -1
This initializes all the fd arguments in closures to -1 and clears them back to -1 when they've been dispatched or serialized. This means that any valid fd in a closure is currently libwayland's responsibility to close in the case of an error. Signed-off-by: Derek Foreman <derekf@osg.samsung.com> Reviewed-by: Daniel Stone <daniels@collabora.com>
Diffstat (limited to 'src')
-rw-r--r--src/connection.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/connection.c b/src/connection.c
index 8d8eb60..29f565b 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -524,6 +524,17 @@ wl_argument_from_va_list(const char *signature, union wl_argument *args,
}
}
+static void
+wl_closure_clear_fds(struct wl_closure *closure)
+{
+ int i;
+
+ for (i = 0; closure->message->signature[i]; i++) {
+ if (closure->message->signature[i] == 'h')
+ closure->args[i].h = -1;
+ }
+}
+
static struct wl_closure *
wl_closure_init(const struct wl_message *message, uint32_t size,
int *num_arrays, union wl_argument *args)
@@ -557,6 +568,14 @@ wl_closure_init(const struct wl_message *message, uint32_t size,
closure->message = message;
closure->count = count;
+ /* Set these all to -1 so we can close any that have been
+ * set to a real value during wl_closure_destroy().
+ * We may have copied a bunch of fds into the closure with
+ * memcpy previously, but those are undup()d client fds
+ * that we would have replaced anyway.
+ */
+ wl_closure_clear_fds(closure);
+
return closure;
}
@@ -948,6 +967,8 @@ wl_closure_invoke(struct wl_closure *closure, uint32_t flags,
opcode, target->interface->name);
}
ffi_call(&cif, implementation[opcode], NULL, ffi_args);
+
+ wl_closure_clear_fds(closure);
}
void
@@ -956,6 +977,8 @@ wl_closure_dispatch(struct wl_closure *closure, wl_dispatcher_func_t dispatcher,
{
dispatcher(target->implementation, target, opcode, closure->message,
closure->args);
+
+ wl_closure_clear_fds(closure);
}
static int
@@ -980,6 +1003,7 @@ copy_fds_to_connection(struct wl_closure *closure,
"can't send file descriptor");
return -1;
}
+ closure->args[i].h = -1;
}
return 0;