From c1093c34d7d81b5b13cc72d4d1941000813001da Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 20 Aug 2020 12:59:23 +0200 Subject: [PATCH] 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 --- src/libsystemd/sd-bus/bus-socket.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c index fc7e8e844a..de36a1f278 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, -- 2.25.1