chiark / gitweb /
sd-bus: socket - only transmit auxillary FDs once (#6603)
authorTom Gundersen <teg@jklm.no>
Wed, 30 Aug 2017 11:09:03 +0000 (13:09 +0200)
committerSven Eden <yamakuzure@gmx.net>
Wed, 30 Aug 2017 11:09:03 +0000 (13:09 +0200)
If a message is too large to fit into the output buffer, it will be
transmitted to the kernel in several chunks. However, the FDs must
only ever be transmitted once or they will bereceived by the remote
end repeatedly.

The D-Bus specification disallows several sets of FDs attached to
one message, however, the reference implementation of D-Bus will
not reject such a message, rather it will reassign the duplicate
FDs to subsequent FD-carrying messages.

This attaches the FD array only to the first byte of the message.

src/libelogind/sd-bus/bus-socket.c

index be12516663bf992828914a85181ed42c4a527e39..982af68c016a00ddde284983d468c71f4c42b41c 100644 (file)
@@ -799,7 +799,7 @@ int bus_socket_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
                         .msg_iovlen = m->n_iovec,
                 };
 
-                if (m->n_fds > 0) {
+                if (m->n_fds > 0 && *idx == 0) {
                         struct cmsghdr *control;
 
                         mh.msg_control = control = alloca(CMSG_SPACE(sizeof(int) * m->n_fds));