From 9bee2f4cd3db42062731756c7080aeb4c3891300 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 28 Jun 2015 17:52:27 -0700 Subject: [PATCH] VFS: Make VFileFILE.unmap only write back if the file was mapped as writable --- src/util/vfs/vfs-file.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/util/vfs/vfs-file.c b/src/util/vfs/vfs-file.c index a995aeccf..70b676e63 100644 --- a/src/util/vfs/vfs-file.c +++ b/src/util/vfs/vfs-file.c @@ -13,6 +13,7 @@ struct VFileFILE { struct VFile d; FILE* file; + bool writable; }; static bool _vffClose(struct VFile* vf); @@ -46,6 +47,7 @@ struct VFile* VFileFromFILE(FILE* file) { } vff->file = file; + vff->writable = false; vff->d.close = _vffClose; vff->d.seek = _vffSeek; vff->d.read = _vffRead; @@ -84,8 +86,10 @@ ssize_t _vffWrite(struct VFile* vf, const void* buffer, size_t size) { } static void* _vffMap(struct VFile* vf, size_t size, int flags) { - UNUSED(flags); struct VFileFILE* vff = (struct VFileFILE*) vf; + if (flags & MAP_WRITE) { + vff->writable = true; + } void* mem = anonymousMemoryMap(size); if (!mem) { return 0; @@ -99,10 +103,12 @@ static void* _vffMap(struct VFile* vf, size_t size, int flags) { static void _vffUnmap(struct VFile* vf, void* memory, size_t size) { struct VFileFILE* vff = (struct VFileFILE*) vf; - long pos = ftell(vff->file); - fseek(vff->file, 0, SEEK_SET); - fwrite(memory, size, 1, vff->file); - fseek(vff->file, pos, SEEK_SET); + if (vff->writable) { + long pos = ftell(vff->file); + fseek(vff->file, 0, SEEK_SET); + fwrite(memory, size, 1, vff->file); + fseek(vff->file, pos, SEEK_SET); + } mappedMemoryFree(memory, size); }