Commit ea5518f69e

Ben Noordhuis <info@bnoordhuis.nl>
2019-04-13 12:31:45
make os_file_close poison file handle after close
This helps track down use-after-close bugs.
1 parent 6284a4c
Changed files (3)
src/cache_hash.cpp
@@ -256,10 +256,10 @@ static Error populate_file_hash(CacheHash *ch, CacheHashFile *chf, Buf *contents
     }
 
     if ((err = hash_file(chf->bin_digest, this_file, contents))) {
-        os_file_close(this_file);
+        os_file_close(&this_file);
         return err;
     }
-    os_file_close(this_file);
+    os_file_close(&this_file);
 
     blake2b_update(&ch->blake, chf->bin_digest, 48);
 
@@ -300,7 +300,7 @@ Error cache_hit(CacheHash *ch, Buf *out_digest) {
     Buf line_buf = BUF_INIT;
     buf_resize(&line_buf, 512);
     if ((err = os_file_read_all(ch->manifest_file, &line_buf))) {
-        os_file_close(ch->manifest_file);
+        os_file_close(&ch->manifest_file);
         return err;
     }
 
@@ -389,14 +389,14 @@ Error cache_hit(CacheHash *ch, Buf *out_digest) {
         OsFileAttr actual_attr;
         if ((err = os_file_open_r(chf->path, &this_file, &actual_attr))) {
             fprintf(stderr, "Unable to open %s\n: %s", buf_ptr(chf->path), err_str(err));
-            os_file_close(ch->manifest_file);
+            os_file_close(&ch->manifest_file);
             return ErrorCacheUnavailable;
         }
         if (chf->attr.mtime.sec == actual_attr.mtime.sec &&
             chf->attr.mtime.nsec == actual_attr.mtime.nsec &&
             chf->attr.inode == actual_attr.inode)
         {
-            os_file_close(this_file);
+            os_file_close(&this_file);
         } else {
             // we have to recompute the digest.
             // later we'll rewrite the manifest with the new mtime/digest values
@@ -411,11 +411,11 @@ Error cache_hit(CacheHash *ch, Buf *out_digest) {
 
             uint8_t actual_digest[48];
             if ((err = hash_file(actual_digest, this_file, nullptr))) {
-                os_file_close(this_file);
-                os_file_close(ch->manifest_file);
+                os_file_close(&this_file);
+                os_file_close(&ch->manifest_file);
                 return err;
             }
-            os_file_close(this_file);
+            os_file_close(&this_file);
             if (memcmp(chf->bin_digest, actual_digest, 48) != 0) {
                 memcpy(chf->bin_digest, actual_digest, 48);
                 // keep going until we have the input file digests
@@ -433,12 +433,12 @@ Error cache_hit(CacheHash *ch, Buf *out_digest) {
             CacheHashFile *chf = &ch->files.at(file_i);
             if ((err = populate_file_hash(ch, chf, nullptr))) {
                 fprintf(stderr, "Unable to hash %s: %s\n", buf_ptr(chf->path), err_str(err));
-                os_file_close(ch->manifest_file);
+                os_file_close(&ch->manifest_file);
                 return ErrorCacheUnavailable;
             }
         }
         if (return_code != ErrorNone) {
-            os_file_close(ch->manifest_file);
+            os_file_close(&ch->manifest_file);
         }
         return return_code;
     }
@@ -453,7 +453,7 @@ Error cache_add_file_fetch(CacheHash *ch, Buf *resolved_path, Buf *contents) {
     CacheHashFile *chf = ch->files.add_one();
     chf->path = resolved_path;
     if ((err = populate_file_hash(ch, chf, contents))) {
-        os_file_close(ch->manifest_file);
+        os_file_close(&ch->manifest_file);
         return err;
     }
 
@@ -586,6 +586,6 @@ void cache_release(CacheHash *ch) {
         }
     }
 
-    os_file_close(ch->manifest_file);
+    os_file_close(&ch->manifest_file);
 }
 
src/os.cpp
@@ -2081,11 +2081,13 @@ Error os_file_overwrite(OsFile file, Buf *contents) {
 #endif
 }
 
-void os_file_close(OsFile file) {
+void os_file_close(OsFile *file) {
 #if defined(ZIG_OS_WINDOWS)
-    CloseHandle(file);
+    CloseHandle(*file);
+    *file = NULL;
 #else
-    close(file);
+    close(*file);
+    *file = -1;
 #endif
 }
 
src/os.hpp
@@ -121,7 +121,7 @@ Error ATTRIBUTE_MUST_USE os_file_open_lock_rw(Buf *full_path, OsFile *out_file);
 Error ATTRIBUTE_MUST_USE os_file_read(OsFile file, void *ptr, size_t *len);
 Error ATTRIBUTE_MUST_USE os_file_read_all(OsFile file, Buf *contents);
 Error ATTRIBUTE_MUST_USE os_file_overwrite(OsFile file, Buf *contents);
-void os_file_close(OsFile file);
+void os_file_close(OsFile *file);
 
 Error ATTRIBUTE_MUST_USE os_write_file(Buf *full_path, Buf *contents);
 Error ATTRIBUTE_MUST_USE os_copy_file(Buf *src_path, Buf *dest_path);