From: Mike Yuan Date: Sat, 31 Aug 2024 13:35:45 +0000 (+0200) Subject: sd-varlink: check correct errno X-Git-Tag: v257-rc1~558^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f0d6ef7ce892d8bc9f4197480693cd10c216c72;p=thirdparty%2Fsystemd.git sd-varlink: check correct errno 'n' can also be assigned from recvmsg_safe(), which is our own func returning negative errno. --- diff --git a/src/libsystemd/sd-varlink/sd-varlink.c b/src/libsystemd/sd-varlink/sd-varlink.c index 447d5c333c0..4665913b1c4 100644 --- a/src/libsystemd/sd-varlink/sd-varlink.c +++ b/src/libsystemd/sd-varlink/sd-varlink.c @@ -870,23 +870,25 @@ static int varlink_read(sd_varlink *v) { bool prefer_read = v->prefer_read; if (!prefer_read) { n = recv(v->input_fd, p, rs, MSG_DONTWAIT); - if (n < 0 && errno == ENOTSOCK) + if (n < 0) + n = -errno; + if (n == -ENOTSOCK) prefer_read = v->prefer_read = true; } - if (prefer_read) + if (prefer_read) { n = read(v->input_fd, p, rs); - } - if (n < 0) { - if (errno == EAGAIN) - return 0; - - if (ERRNO_IS_DISCONNECT(errno)) { - v->read_disconnected = true; - return 1; + if (n < 0) + n = -errno; } - - return -errno; } + if (ERRNO_IS_NEG_TRANSIENT(n)) + return 0; + if (ERRNO_IS_NEG_DISCONNECT(n)) { + v->read_disconnected = true; + return 1; + } + if (n < 0) + return n; if (n == 0) { /* EOF */ if (v->allow_fd_passing_input) @@ -897,7 +899,7 @@ static int varlink_read(sd_varlink *v) { } if (v->allow_fd_passing_input) { - struct cmsghdr* cmsg; + struct cmsghdr *cmsg; cmsg = cmsg_find(&mh, SOL_SOCKET, SCM_RIGHTS, (socklen_t) -1); if (cmsg) {