chiark / gitweb /
bus: when we unmarshal an fd it should stay owned by the message object
authorLennart Poettering <lennart@poettering.net>
Wed, 10 Apr 2013 21:04:20 +0000 (23:04 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 10 Apr 2013 21:23:19 +0000 (23:23 +0200)
If the user wants the fd to stay valid he should keep a reference to the
message object or duplicate the fd.

This unifies behaviour of demarshalling data fields and unix fds.

src/libsystemd-bus/bus-message.c
src/libsystemd-bus/test-bus-chat.c

index fb63a2d1cf34b6bffda27b54dd372cc51d917f3f..3081664091af23e6629793efe057f1a00c644ff1 100644 (file)
@@ -1710,18 +1710,13 @@ int sd_bus_message_read_basic(sd_bus_message *m, char type, void *p) {
                         break;
 
                 case SD_BUS_TYPE_UNIX_FD: {
-                        int copy;
                         uint32_t j;
 
                         j = BUS_MESSAGE_BSWAP32(m, *(uint32_t*) q);
                         if (j >= m->n_fds)
                                 return -EBADMSG;
 
-                        copy = fcntl(m->fds[j], F_DUPFD_CLOEXEC, 3);
-                        if (copy < 0)
-                                return -errno;
-
-                        *(int*) p = copy;
+                        *(int*) p = m->fds[j];
                         break;
                 }
 
index 533d78cc3b937c5a4b42b3d2ee10251ddbf6bd9c..371c7a7513fa8eac10098cc7763c224c1b6fa7d2 100644 (file)
@@ -230,8 +230,6 @@ static int server(sd_bus *bus) {
                                 goto fail;
                         }
 
-                        close_nointr_nofail(fd);
-
                         r = sd_bus_reply_method_return(bus, m, NULL);
                         if (r < 0) {
                                 log_error("Failed to send reply: %s", strerror(-r));