diff options
-rw-r--r-- | libbb/read.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/libbb/read.c b/libbb/read.c index 5906bc225..a342506a8 100644 --- a/libbb/read.c +++ b/libbb/read.c | |||
@@ -12,9 +12,17 @@ ssize_t FAST_FUNC safe_read(int fd, void *buf, size_t count) | |||
12 | { | 12 | { |
13 | ssize_t n; | 13 | ssize_t n; |
14 | 14 | ||
15 | do { | 15 | for (;;) { |
16 | n = read(fd, buf, count); | 16 | n = read(fd, buf, count); |
17 | } while (n < 0 && errno == EINTR); | 17 | if (n >= 0 || errno != EINTR) |
18 | break; | ||
19 | /* Some callers set errno=0, are upset when they see EINTR. | ||
20 | * Returning EINTR is wrong since we retry read(), | ||
21 | * the "error" was transient. | ||
22 | */ | ||
23 | errno = 0; | ||
24 | /* repeat the read() */ | ||
25 | } | ||
18 | 26 | ||
19 | return n; | 27 | return n; |
20 | } | 28 | } |