OSDN Git Service

libext2fs: fix memory leaks (on error paths)
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 11 Dec 2013 01:21:34 +0000 (17:21 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 12 Dec 2013 18:16:59 +0000 (13:16 -0500)
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/ext2fs/gen_bitmap64.c
lib/ext2fs/mkjournal.c
lib/ext2fs/newdir.c
lib/ext2fs/qcow2.c

index d02488c..9ba7701 100644 (file)
@@ -128,6 +128,7 @@ errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
        if (gettimeofday(&bitmap->stats.created,
                         (struct timezone *) NULL) == -1) {
                perror("gettimeofday");
+               ext2fs_free_mem(&bitmap);
                return 1;
        }
        bitmap->stats.type = type;
@@ -300,6 +301,7 @@ errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
        if (gettimeofday(&new_bmap->stats.created,
                         (struct timezone *) NULL) == -1) {
                perror("gettimeofday");
+               ext2fs_free_mem(&new_bmap);
                return 1;
        }
        new_bmap->stats.type = src->stats.type;
index 1d5b1a7..09ca412 100644 (file)
@@ -312,13 +312,15 @@ static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
                return retval;
 
        if ((retval = ext2fs_read_bitmaps(fs)))
-               return retval;
+               goto out2;
 
        if ((retval = ext2fs_read_inode(fs, journal_ino, &inode)))
-               return retval;
+               goto out2;
 
-       if (inode.i_blocks > 0)
-               return EEXIST;
+       if (inode.i_blocks > 0) {
+               retval = EEXIST;
+               goto out2;
+       }
 
        es.num_blocks = num_blocks;
        es.newblocks = 0;
@@ -330,7 +332,7 @@ static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
        if (fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS) {
                inode.i_flags |= EXT4_EXTENTS_FL;
                if ((retval = ext2fs_write_inode(fs, journal_ino, &inode)))
-                       return retval;
+                       goto out2;
        }
 
        /*
@@ -398,6 +400,7 @@ static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
 
 errout:
        ext2fs_zero_blocks2(0, 0, 0, 0, 0);
+out2:
        ext2fs_free_mem(&buf);
        return retval;
 }
index b0a1e47..3e2c0db 100644 (file)
@@ -44,8 +44,10 @@ errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
        dir = (struct ext2_dir_entry *) buf;
 
        retval = ext2fs_set_rec_len(fs, fs->blocksize, dir);
-       if (retval)
+       if (retval) {
+               ext2fs_free_mem(&buf);
                return retval;
+       }
 
        if (dir_ino) {
                if (fs->super->s_feature_incompat &
@@ -65,8 +67,10 @@ errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
                 */
                dir = (struct ext2_dir_entry *) (buf + dir->rec_len);
                retval = ext2fs_set_rec_len(fs, rec_len, dir);
-               if (retval)
+               if (retval) {
+                       ext2fs_free_mem(&buf);
                        return retval;
+               }
                dir->inode = parent_ino;
                dir->name_len = 2 | filetype;
                dir->name[0] = '.';
index 8394270..547edc0 100644 (file)
@@ -60,8 +60,10 @@ struct ext2_qcow2_hdr *qcow2_read_header(int fd)
                return NULL;
        memset(buffer, 0, sizeof(struct ext2_qcow2_hdr));
 
-       if (ext2fs_llseek(fd, 0, SEEK_SET < 0))
+       if (ext2fs_llseek(fd, 0, SEEK_SET < 0)) {
+               ext2fs_free_mem(&buffer);
                return NULL;
+       }
 
        size = read(fd, buffer, sizeof(struct ext2_qcow2_hdr));
        if (size != sizeof(struct ext2_qcow2_hdr)) {
@@ -91,8 +93,10 @@ static int qcow2_read_l1_table(struct ext2_qcow2_image *img)
        if (ret)
                return ret;
 
-       if (ext2fs_llseek(fd, img->l1_offset, SEEK_SET) < 0)
+       if (ext2fs_llseek(fd, img->l1_offset, SEEK_SET) < 0) {
+               ext2fs_free_mem(&table);
                return errno;
+       }
 
        size = read(fd, table, l1_size);
        if (size != l1_size) {
@@ -236,8 +240,10 @@ int qcow2_write_raw_image(int qcow2_fd, int raw_fd,
 
        ((char *)copy_buf)[0] = 0;
        size = write(raw_fd, copy_buf, 1);
-       if (size != 1)
-               return errno;
+       if (size != 1) {
+               ret = errno;
+               goto out;
+       }
 
 out:
        if (copy_buf)