[PATCH 3/7] read_in_full: reset errno before reading
- From
Jeff King <peff@peff.net>
- Date
- Sep 25, 2017, 20:29 UTC
- Message-ID
- <20170925202916.4tqo4gttrsoy7kai@sigill.intra.peff.net>
- In-Reply-To
- <20170925202646.agsnpmar3dzocdcr@sigill.intra.peff.net>
Many callers of read_in_full() complain when we do not read their full byte-count. But a check like:
if (read_in_full(fd, buf, len) != len)
return error_errno("unable to read");conflates two problem conditions:
1. A real error from read().
2. There were fewer than "len" bytes available.
In the first case, showing the user strerror(errno) is useful. But in the second, we may see a random errno that was set by some previous system call.
In an ideal world, callers would always distinguish between these cases and give a useful message for each. But as an easy way to make our imperfect world better, let's reset errno to a known value. The best we can do is "0", which will yield something like:
unable to read: Success
That's not great, but at least it's deterministic and makes it clear that we didn't see an error from read().
Signed-off-by: Jeff King <peff@peff.net> --- wrapper.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/wrapper.c b/wrapper.c index 61aba0b5c1..f55debc92d 100644 --- a/wrapper.c +++ b/wrapper.c @@ -314,6 +314,7 @@ ssize_t read_in_full(int fd, void *buf, size_t count) char *p = buf; ssize_t total = 0; + errno = 0; while (count > 0) { ssize_t loaded = xread(fd, p, count); if (loaded < 0)
-- 2.14.1.1148.ga2561536a1