summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIwan Timmer <irtimmer@gmail.com>2018-06-14 17:00:50 +0200
committerLennart Poettering <lennart@poettering.net>2018-06-14 20:01:03 +0200
commitf6c9c5f8ed8dc3fadb0ea284658d5506a3d2cad2 (patch)
treee132ef21b99a8a9b00471e9a5d6da05f4c06e89a
parent30ce657e5dc3ca038f5703a610dc65189cd750ed (diff)
downloadsystemd-f6c9c5f8ed8dc3fadb0ea284658d5506a3d2cad2.tar.gz
resolved: fix error handling in resolved-dns-stream
During the transition from system functions using errno to our own read and write functions with negative return codes some errors where introduced. This patch correctly convert errno to negative return codes for read and write and fix checks still using errno instead of the return code. Closes #9283
-rw-r--r--src/resolve/resolved-dns-stream.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/resolve/resolved-dns-stream.c b/src/resolve/resolved-dns-stream.c
index 4ab15ebcaa..d133efa751 100644
--- a/src/resolve/resolved-dns-stream.c
+++ b/src/resolve/resolved-dns-stream.c
@@ -245,8 +245,11 @@ static ssize_t dns_stream_writev(DnsStream *s, const struct iovec *iov, size_t i
r = -EAGAIN;
} else
s->tfo_salen = 0; /* connection is made */
- } else
+ } else {
r = writev(s->fd, iov, iovcnt);
+ if (r < 0)
+ r = -errno;
+ }
return r;
}
@@ -278,7 +281,11 @@ static ssize_t dns_stream_read(DnsStream *s, void *buf, size_t count) {
}
} else
#endif
+ {
ss = read(s->fd, buf, count);
+ if (ss < 0)
+ ss = -errno;
+ }
return ss;
}
@@ -370,8 +377,8 @@ static int on_stream_io(sd_event_source *es, int fd, uint32_t revents, void *use
ss = dns_stream_writev(s, iov, 2, 0);
if (ss < 0) {
- if (!IN_SET(errno, EINTR, EAGAIN))
- return dns_stream_complete(s, errno);
+ if (!IN_SET(-ss, EINTR, EAGAIN))
+ return dns_stream_complete(s, -ss);
} else
s->n_written += ss;
@@ -392,8 +399,8 @@ static int on_stream_io(sd_event_source *es, int fd, uint32_t revents, void *use
ss = dns_stream_read(s, (uint8_t*) &s->read_size + s->n_read, sizeof(s->read_size) - s->n_read);
if (ss < 0) {
- if (!IN_SET(errno, EINTR, EAGAIN))
- return dns_stream_complete(s, errno);
+ if (!IN_SET(-ss, EINTR, EAGAIN))
+ return dns_stream_complete(s, -ss);
} else if (ss == 0)
return dns_stream_complete(s, ECONNRESET);
else