Treat dup failures as a marshalling error and return NULL.
The compositor will destroy the offending client but keep other clients intact.
A client entcountering dup failure will still abort(), as it does on other 
marshalling errors.

Signed-off-by: Karsten Otto <[email protected]>
---
src/connection.c        | 13 +++++++++----
tests/connection-test.c |  1 +
2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/connection.c b/src/connection.c
index f292853..f4913be 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -563,10 +563,8 @@ wl_closure_marshal(struct wl_object *sender, uint32_t 
opcode,
                case 'h':
                        fd = args[i].h;
                        dup_fd = wl_os_dupfd_cloexec(fd, 0);
-                       if (dup_fd < 0) {
-                               wl_log("dup failed: %m");
-                               abort();
-                       }
+                       if (dup_fd < 0)
+                               goto err_fd;
                        closure->args[i].h = dup_fd;
                        break;
                default:
@@ -584,6 +582,13 @@ wl_closure_marshal(struct wl_object *sender, uint32_t 
opcode,

        return closure;

+err_fd:
+       wl_closure_destroy(closure);
+       wl_log("error marshalling arguments for %s (signature %s): "
+              "failed to prepare file descriptor for arg %i - %m\n",
+              message->name, message->signature, i);
+       return NULL;
+
err_null:
        wl_closure_destroy(closure);
        wl_log("error marshalling arguments for %s (signature %s): "
diff --git a/tests/connection-test.c b/tests/connection-test.c
index 659bf68..d2336c9 100644
--- a/tests/connection-test.c
+++ b/tests/connection-test.c
@@ -268,6 +268,7 @@ TEST(connection_marshal_nullables)
        expected_fail_marshal(EINVAL, "o", NULL);
        expected_fail_marshal(EINVAL, "s", NULL);
        expected_fail_marshal(EINVAL, "a", NULL);
+       expected_fail_marshal(EBADF, "h", -1);

        marshal(&data, "?o", 12, NULL);
        assert(data.buffer[2] == 0);
-- 
1.9.1

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to