fiemap copy: avoid leak-on-error
authorJim Meyering <meyering@redhat.com>
Thu, 27 Jan 2011 16:49:04 +0000 (17:49 +0100)
committerJim Meyering <meyering@redhat.com>
Sun, 30 Jan 2011 19:44:12 +0000 (20:44 +0100)
* src/copy.c (extent_copy): Don't leak an extent_scan buffer on
failed lseek, read, or write.

src/copy.c

index 9a3a8f7..208e463 100644 (file)
@@ -234,6 +234,8 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
           if (lseek (src_fd, ext_start, SEEK_SET) < 0)
             {
               error (0, errno, _("cannot lseek %s"), quote (src_name));
+            fail:
+              extent_scan_free (&scan);
               return false;
             }
 
@@ -242,7 +244,7 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
               if (lseek (dest_fd, ext_start, SEEK_SET) < 0)
                 {
                   error (0, errno, _("cannot lseek %s"), quote (dst_name));
-                  return false;
+                  goto fail;
                 }
             }
           else
@@ -257,7 +259,7 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
                   if (! write_zeros (dest_fd, hole_size))
                     {
                       error (0, errno, _("%s: write failed"), quote (dst_name));
-                      return false;
+                      goto fail;
                     }
                 }
             }
@@ -279,7 +281,7 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
                     continue;
 #endif
                   error (0, errno, _("reading %s"), quote (src_name));
-                    return false;
+                  goto fail;
                 }
 
               if (n_read == 0)
@@ -292,7 +294,7 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
               if (full_write (dest_fd, buf, n_read) != n_read)
                 {
                   error (0, errno, _("writing %s"), quote (dst_name));
-                  return false;
+                  goto fail;
                 }
 
               ext_len -= n_read;