From: Lennart Poettering Date: Thu, 20 Aug 2020 10:59:23 +0000 (+0200) Subject: sd-bus: fix error handling on readv() X-Git-Tag: v247-rc1~394 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1093c34d7d81b5b13cc72d4d1941000813001da;p=thirdparty%2Fsystemd.git sd-bus: fix error handling on readv() let's make sure we collect the right error code from errno, otherwise we'll see EPERM (i.e. error 1) for all errors readv() returns (since it returns -1 on error), including EAGAIN. This is definitely backport material. A fix-up for 3691bcf3c5eebdcca5b4f1c51c745441c57a6cd1. Fixes: #16699 --- diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c index fc7e8e844ab..de36a1f278a 100644 --- a/src/libsystemd/sd-bus/bus-socket.c +++ b/src/libsystemd/sd-bus/bus-socket.c @@ -544,9 +544,11 @@ static int bus_socket_read_auth(sd_bus *b) { iov = IOVEC_MAKE((uint8_t *)b->rbuffer + b->rbuffer_size, n - b->rbuffer_size); - if (b->prefer_readv) + if (b->prefer_readv) { k = readv(b->input_fd, &iov, 1); - else { + if (k < 0) + k = -errno; + } else { mh = (struct msghdr) { .msg_iov = &iov, .msg_iovlen = 1, @@ -1187,9 +1189,11 @@ int bus_socket_read_message(sd_bus *bus) { iov = IOVEC_MAKE((uint8_t *)bus->rbuffer + bus->rbuffer_size, need - bus->rbuffer_size); - if (bus->prefer_readv) + if (bus->prefer_readv) { k = readv(bus->input_fd, &iov, 1); - else { + if (k < 0) + k = -errno; + } else { mh = (struct msghdr) { .msg_iov = &iov, .msg_iovlen = 1,