If we fail to completely marshal a closure then we need to close the fds
we created with dupfd.

Signed-off-by: Derek Foreman <der...@osg.samsung.com>
---
 src/connection.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/connection.c b/src/connection.c
index 7fe35b5..22bf836 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -532,6 +532,7 @@ wl_closure_marshal(struct wl_object *sender, uint32_t 
opcode,
        struct wl_closure *closure;
        struct wl_object *object;
        int i, count, fd, dup_fd;
+       int fds[WL_CLOSURE_MAX_ARGS], fd_count = 0;
        const char *signature;
        struct argument_details arg;
 
@@ -584,6 +585,7 @@ wl_closure_marshal(struct wl_object *sender, uint32_t 
opcode,
                        if (dup_fd < 0)
                                wl_abort("dup failed: %s\n", strerror(errno));
                        closure->args[i].h = dup_fd;
+                       fds[fd_count++] = dup_fd;
                        break;
                default:
                        wl_abort("unhandled format code: '%c'\n", arg.type);
@@ -599,6 +601,8 @@ wl_closure_marshal(struct wl_object *sender, uint32_t 
opcode,
        return closure;
 
 err_null:
+       for (i = 0; i < fd_count; i++)
+               close(fds[i]);
        wl_closure_destroy(closure);
        wl_log("error marshalling arguments for %s (signature %s): "
               "null value passed for arg %i\n", message->name,
-- 
2.11.0

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to