[git commit] libbb: safe_write should not return EINTR

Denys Vlasenko vda.linux at googlemail.com
Fri Jul 14 12:22:09 UTC 2017


commit: https://git.busybox.net/busybox/commit/?id=a03ac6067764549f4ae25f9a34e1ee9b0d2bb4f2
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 libbb/safe_write.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/libbb/safe_write.c b/libbb/safe_write.c
index 8f76280..aad50f5 100644
--- a/libbb/safe_write.c
+++ b/libbb/safe_write.c
@@ -13,9 +13,17 @@ ssize_t FAST_FUNC safe_write(int fd, const void *buf, size_t count)
 {
 	ssize_t n;
 
-	do {
+	for (;;) {
 		n = write(fd, buf, count);
-	} while (n < 0 && errno == EINTR);
+		if (n >= 0 || errno != EINTR)
+			break;
+		/* Some callers set errno=0, are upset when they see EINTR.
+		 * Returning EINTR is wrong since we retry write(),
+		 * the "error" was transient.
+		 */
+		errno = 0;
+		/* repeat the write() */
+	}
 
 	return n;
 }


More information about the busybox-cvs mailing list