]> granicus.if.org Git - neomutt/commitdiff
Refactor mutt_file_unlink
authorFederico Kircheis <federico.kircheis@gmail.com>
Tue, 6 Mar 2018 19:19:06 +0000 (20:19 +0100)
committerRichard Russon <rich@flatcap.org>
Thu, 8 Mar 2018 03:18:02 +0000 (03:18 +0000)
mutt/file.c

index 9f319f86de82dcfc4d46d2313ce16bc8658b9f68..d894288f66456174886586cddd9b6bce1cdc79be 100644 (file)
@@ -227,35 +227,39 @@ int mutt_file_fsync_close(FILE **f)
  */
 void mutt_file_unlink(const char *s)
 {
-  struct stat sb, sb2;
+  struct stat sb;
   /* Defend against symlink attacks */
 
-  if ((lstat(s, &sb) == 0) && S_ISREG(sb.st_mode))
+  const bool is_regular_file = (lstat(s, &sb) == 0) && S_ISREG(sb.st_mode);
+  if (!is_regular_file)
   {
-    const int fd = open(s, O_RDWR | O_NOFOLLOW);
-    if (fd < 0)
-      return;
+    return;
+  }
 
-    if ((fstat(fd, &sb2) != 0) || !S_ISREG(sb2.st_mode) ||
-        (sb.st_dev != sb2.st_dev) || (sb.st_ino != sb2.st_ino))
-    {
-      close(fd);
-      return;
-    }
+  const int fd = open(s, O_RDWR | O_NOFOLLOW);
+  if (fd < 0)
+    return;
 
-    FILE *f = fdopen(fd, "r+");
-    if (f)
+  struct stat sb2;
+  if ((fstat(fd, &sb2) != 0) || !S_ISREG(sb2.st_mode) ||
+      (sb.st_dev != sb2.st_dev) || (sb.st_ino != sb2.st_ino))
+  {
+    close(fd);
+    return;
+  }
+
+  FILE *f = fdopen(fd, "r+");
+  if (f)
+  {
+    unlink(s);
+    char buf[2048];
+    memset(buf, 0, sizeof(buf));
+    while (sb.st_size > 0)
     {
-      unlink(s);
-      char buf[2048];
-      memset(buf, 0, sizeof(buf));
-      while (sb.st_size > 0)
-      {
-        fwrite(buf, 1, MIN(sizeof(buf), sb.st_size), f);
-        sb.st_size -= MIN(sizeof(buf), sb.st_size);
-      }
-      mutt_file_fclose(&f);
+      fwrite(buf, 1, MIN(sizeof(buf), sb.st_size), f);
+      sb.st_size -= MIN(sizeof(buf), sb.st_size);
     }
+    mutt_file_fclose(&f);
   }
 }