diff options
author | Michael Runge <mrunge@google.com> | 2014-10-31 01:13:22 +0100 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-31 01:13:22 +0100 |
commit | 8bebe58e540b34078aecd155e7b58a7a02985483 (patch) | |
tree | 069f253141421da52f75be660c9629d3f998aa4b | |
parent | am e908a454: am 042c3cd0: Force sync files written by minzip. (diff) | |
parent | am be81e51c: Use more aggressive sync writing to applypatch. (diff) | |
download | android_bootable_recovery-8bebe58e540b34078aecd155e7b58a7a02985483.tar android_bootable_recovery-8bebe58e540b34078aecd155e7b58a7a02985483.tar.gz android_bootable_recovery-8bebe58e540b34078aecd155e7b58a7a02985483.tar.bz2 android_bootable_recovery-8bebe58e540b34078aecd155e7b58a7a02985483.tar.lz android_bootable_recovery-8bebe58e540b34078aecd155e7b58a7a02985483.tar.xz android_bootable_recovery-8bebe58e540b34078aecd155e7b58a7a02985483.tar.zst android_bootable_recovery-8bebe58e540b34078aecd155e7b58a7a02985483.zip |
-rw-r--r-- | applypatch/applypatch.c | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/applypatch/applypatch.c b/applypatch/applypatch.c index bfb9440e4..2c86e0984 100644 --- a/applypatch/applypatch.c +++ b/applypatch/applypatch.c @@ -309,7 +309,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) { // Save the contents of the given FileContents object under the given // filename. Return 0 on success. int SaveFileContents(const char* filename, const FileContents* file) { - int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR); if (fd < 0) { printf("failed to open \"%s\" for write: %s\n", filename, strerror(errno)); @@ -324,8 +324,14 @@ int SaveFileContents(const char* filename, const FileContents* file) { close(fd); return -1; } - fsync(fd); - close(fd); + if (fsync(fd) != 0) { + printf("fsync of \"%s\" failed: %s\n", filename, strerror(errno)); + return -1; + } + if (close(fd) != 0) { + printf("close of \"%s\" failed: %s\n", filename, strerror(errno)); + return -1; + } if (chmod(filename, file->st.st_mode) != 0) { printf("chmod of \"%s\" failed: %s\n", filename, strerror(errno)); @@ -408,7 +414,7 @@ int WriteToPartition(unsigned char* data, size_t len, { size_t start = 0; int success = 0; - int fd = open(partition, O_RDWR); + int fd = open(partition, O_RDWR | O_SYNC); if (fd < 0) { printf("failed to open %s: %s\n", partition, strerror(errno)); return -1; @@ -433,7 +439,22 @@ int WriteToPartition(unsigned char* data, size_t len, } start += written; } - fsync(fd); + if (fsync(fd) != 0) { + printf("failed to sync to %s (%s)\n", + partition, strerror(errno)); + return -1; + } + if (close(fd) != 0) { + printf("failed to close %s (%s)\n", + partition, strerror(errno)); + return -1; + } + fd = open(partition, O_RDONLY); + if (fd < 0) { + printf("failed to reopen %s for verify (%s)\n", + partition, strerror(errno)); + return -1; + } // drop caches so our subsequent verification read // won't just be reading the cache. @@ -919,7 +940,8 @@ static int GenerateTarget(FileContents* source_file, strcpy(outname, target_filename); strcat(outname, ".patch"); - output = open(outname, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + output = open(outname, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC, + S_IRUSR | S_IWUSR); if (output < 0) { printf("failed to open output file %s: %s\n", outname, strerror(errno)); @@ -950,8 +972,14 @@ static int GenerateTarget(FileContents* source_file, } if (output >= 0) { - fsync(output); - close(output); + if (fsync(output) != 0) { + printf("failed to fsync file \"%s\" (%s)\n", outname, strerror(errno)); + result = 1; + } + if (close(output) != 0) { + printf("failed to close file \"%s\" (%s)\n", outname, strerror(errno)); + result = 1; + } } if (result != 0) { |