Merge "updater: Use O_SYNC and fsync() for package_extract_file()." am: 4e72d1a81e
am: 125a6349b9

* commit '125a6349b9b390bd531690099939aaaf8a7513a8':
  updater: Use O_SYNC and fsync() for package_extract_file().
diff --git a/updater/install.cpp b/updater/install.cpp
index e2b3db7..b090869 100644
--- a/updater/install.cpp
+++ b/updater/install.cpp
@@ -555,14 +555,21 @@
         }
 
         {
-            FILE* f = fopen(dest_path, "wb");
-            if (f == NULL) {
-                printf("%s: can't open %s for write: %s\n",
-                        name, dest_path, strerror(errno));
+            int fd = TEMP_FAILURE_RETRY(open(dest_path, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC,
+                  S_IRUSR | S_IWUSR));
+            if (fd == -1) {
+                printf("%s: can't open %s for write: %s\n", name, dest_path, strerror(errno));
                 goto done2;
             }
-            success = mzExtractZipEntryToFile(za, entry, fileno(f));
-            fclose(f);
+            success = mzExtractZipEntryToFile(za, entry, fd);
+            if (fsync(fd) == -1) {
+                printf("fsync of \"%s\" failed: %s\n", dest_path, strerror(errno));
+                success = false;
+            }
+            if (close(fd) == -1) {
+                printf("close of \"%s\" failed: %s\n", dest_path, strerror(errno));
+                success = false;
+            }
         }
 
       done2: