From e12c896b991b6327006f2e50b13f2023aaeed280 Mon Sep 17 00:00:00 2001 From: Maarten ter Huurne Date: Mon, 18 Aug 2014 22:51:58 +0200 Subject: [PATCH] Make writeStringToFile resilient against short writes There are various situations in which write() might write less than the requested amount. In that case, if any progress was made (more than 0 bytes written), try again, otherwise consider it an error. Thanks to Nebuleon for reviewing. --- src/utilities.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/utilities.cpp b/src/utilities.cpp index 7663778..b86151e 100644 --- a/src/utilities.cpp +++ b/src/utilities.cpp @@ -92,7 +92,19 @@ bool writeStringToFile(string const& filename, string const& data) { } // Write temporary file. - bool ok = write(fd, data.c_str(), data.size()) >= 0; + const char *bytes = data.c_str(); + size_t remaining = data.size(); + bool ok = true; + while (remaining != 0) { + ssize_t written = write(fd, bytes, remaining); + if (written <= 0) { + ok = false; + break; + } else { + bytes += written; + remaining -= written; + } + } if (ok) { ok = fsync(fd) == 0; }