summaryrefslogtreecommitdiff
path: root/debugfs
diff options
context:
space:
mode:
authorAndreas Dilger <adilger@dilger.ca>2014-05-20 16:30:35 -0600
committerTheodore Ts'o <tytso@mit.edu>2014-05-22 17:54:36 -0400
commit9d8cd8c461136d2a2c4bf0879a792c227665b31c (patch)
treee938f382bf73b2e7ae32abd520e1d08236f3b949 /debugfs
parent90c5b4c9de8ea43e0994cc3a07cdc4c4c777623c (diff)
downloade2fsprogs-9d8cd8c461136d2a2c4bf0879a792c227665b31c.tar.gz
debugfs: fix filehandle leak in copy_file()
Fix a file handle leak for the target file in copy_file() when error handlers return without closing the file. Instead, clean up at the end of the function to handle cleanup in normal and error cases. Minor other code style cleanups. Signed-off-by: Andreas Dilger <adilger@dilger.ca> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'debugfs')
-rw-r--r--debugfs/debugfs.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index 326f41e8..e53e0b92 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -1578,10 +1578,11 @@ void do_find_free_inode(int argc, char *argv[])
}
#ifndef READ_ONLY
-static errcode_t copy_file(int fd, ext2_ino_t newfile, int bufsize, int make_holes)
+static errcode_t copy_file(int fd, ext2_ino_t newfile, int bufsize,
+ int make_holes)
{
ext2_file_t e2_file;
- errcode_t retval;
+ errcode_t retval, close_ret;
int got;
unsigned int written;
char *buf;
@@ -1597,15 +1598,14 @@ static errcode_t copy_file(int fd, ext2_ino_t newfile, int bufsize, int make_hol
retval = ext2fs_get_mem(bufsize, &buf);
if (retval) {
com_err("copy_file", retval, "can't allocate buffer\n");
- return retval;
+ goto out_close;
}
/* This is used for checking whether the whole block is zero */
retval = ext2fs_get_memzero(bufsize, &zero_buf);
if (retval) {
- com_err("copy_file", retval, "can't allocate buffer\n");
- ext2fs_free_mem(&buf);
- return retval;
+ com_err("copy_file", retval, "can't allocate zero buffer\n");
+ goto out_free_buf;
}
while (1) {
@@ -1624,7 +1624,8 @@ static errcode_t copy_file(int fd, ext2_ino_t newfile, int bufsize, int make_hol
cmp = memcmp(ptr, zero_buf, got);
if (cmp == 0) {
/* The whole block is zero, make a hole */
- retval = ext2fs_file_lseek(e2_file, got, EXT2_SEEK_CUR, NULL);
+ retval = ext2fs_file_lseek(e2_file, got,
+ EXT2_SEEK_CUR, NULL);
if (retval)
goto fail;
got = 0;
@@ -1642,15 +1643,15 @@ static errcode_t copy_file(int fd, ext2_ino_t newfile, int bufsize, int make_hol
ptr += written;
}
}
- ext2fs_free_mem(&buf);
- ext2fs_free_mem(&zero_buf);
- retval = ext2fs_file_close(e2_file);
- return retval;
fail:
- ext2fs_free_mem(&buf);
ext2fs_free_mem(&zero_buf);
- (void) ext2fs_file_close(e2_file);
+out_free_buf:
+ ext2fs_free_mem(&buf);
+out_close:
+ close_ret = ext2fs_file_close(e2_file);
+ if (retval == 0)
+ retval = close_ret;
return retval;
}