]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: fix error handling on readv()
authorLennart Poettering <lennart@poettering.net>
Thu, 20 Aug 2020 10:59:23 +0000 (12:59 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 20 Aug 2020 12:14:36 +0000 (14:14 +0200)
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

index fc7e8e844abda5ed0864b3632894137b220d5710..de36a1f278af70654956e9b9467b98c529984939 100644 (file)
@@ -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,