util/disk_cache: check rename result
authorGrazvydas Ignotas <notasas@gmail.com>
Sat, 18 Mar 2017 20:58:55 +0000 (22:58 +0200)
committerTimothy Arceri <tarceri@itsqueeze.com>
Sun, 19 Mar 2017 21:24:46 +0000 (08:24 +1100)
I haven't seen this causing problems in practice, but for correctness
we should also check if rename succeeded to avoid breaking accounting
and leaving a .tmp file behind.

Signed-off-by: Grazvydas Ignotas <notasas@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/util/disk_cache.c

index 36b27d95ede581adbdc51ae0d867a5d27ca6c03d..d7e1996c41b07e838bdad6e47bb8003ab3ef74d1 100644 (file)
@@ -878,7 +878,11 @@ cache_put(void *job, int thread_index)
       unlink(filename_tmp);
       goto done;
    }
-   rename(filename_tmp, filename);
+   ret = rename(filename_tmp, filename);
+   if (ret == -1) {
+      unlink(filename_tmp);
+      goto done;
+   }
 
    file_size += cf_data_size;
    p_atomic_add(dc_job->cache->size, file_size);
@@ -886,7 +890,7 @@ cache_put(void *job, int thread_index)
  done:
    if (fd_final != -1)
       close(fd_final);
-   /* This close finally releases the flock, (now that the final dile
+   /* This close finally releases the flock, (now that the final file
     * has been renamed into place and the size has been added).
     */
    if (fd != -1)