[PATCH wayland v3 05/10] connection: Make wl_closure_destroy() close fds of undispatched closures
Derek Foreman
derekf at osg.samsung.com
Wed Dec 6 17:22:20 UTC 2017
When we have a closure that can't be dispatched for some reason, and it
contains file descriptors, we must close those descriptors to prevent
leaking them.
Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---
src/connection.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/src/connection.c b/src/connection.c
index 29f565b..e92de79 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -1273,8 +1273,29 @@ wl_closure_print(struct wl_closure *closure, struct wl_object *target, int send)
fprintf(stderr, ")\n");
}
+static int
+wl_closure_close_fds(struct wl_closure *closure)
+{
+ int i;
+ struct argument_details arg;
+ const char *signature = closure->message->signature;
+
+ for (i = 0; i < closure->count; i++) {
+ signature = get_next_argument(signature, &arg);
+ if (arg.type == 'h' && closure->args[i].h != -1)
+ close(closure->args[i].h);
+ }
+
+ return 0;
+}
+
void
wl_closure_destroy(struct wl_closure *closure)
{
+ /* wl_closure_destroy has free() semantics */
+ if (!closure)
+ return;
+
+ wl_closure_close_fds(closure);
free(closure);
}
--
2.15.0
More information about the wayland-devel
mailing list