* pass1.c (e2fsck_pass1, check_ext_attr),
pass5.c (check_block_bitmaps, check_inode_bitmaps),
pass4.c (e2fsck_pass4), swapfs.c (swap_inodes),
+ journal.c (e2fsck_get_journal),
unix.c (parse_extended_opts): Fix memory leaks
2007-03-21 Theodore Tso <tytso@mit.edu>
int ext_journal = 0;
int tried_backup_jnl = 0;
int i;
-
+
clear_problem_context(&pctx);
-
+
journal = e2fsck_allocate_memory(ctx, sizeof(journal_t), "journal");
if (!journal) {
return EXT2_ET_NO_MEMORY;
goto errout;
}
dev_journal = dev_fs+1;
-
+
dev_fs->k_ctx = dev_journal->k_ctx = ctx;
dev_fs->k_dev = K_DEV_FS;
dev_journal->k_dev = K_DEV_JOURNAL;
-
+
journal->j_dev = dev_journal;
journal->j_fs_dev = dev_fs;
journal->j_inode = NULL;
journal->j_blocksize = ctx->fs->blocksize;
if (uuid_is_null(sb->s_journal_uuid)) {
- if (!sb->s_journal_inum)
- return EXT2_ET_BAD_INODE_NUM;
+ if (!sb->s_journal_inum) {
+ retval = EXT2_ET_BAD_INODE_NUM;
+ goto errout;
+ }
j_inode = e2fsck_allocate_memory(ctx, sizeof(*j_inode),
"journal inode");
if (!j_inode) {
j_inode->i_ctx = ctx;
j_inode->i_ino = sb->s_journal_inum;
-
+
if ((retval = ext2fs_read_inode(ctx->fs,
sb->s_journal_inum,
&j_inode->i_ext2))) {
ctx->journal_name = blkid_devno_to_devname(sb->s_journal_dev);
}
journal_name = ctx->journal_name;
-
+
if (!journal_name) {
fix_problem(ctx, PR_0_CANT_FIND_JOURNAL, &pctx);
- return EXT2_ET_LOAD_EXT_JOURNAL;
+ retval = EXT2_ET_LOAD_EXT_JOURNAL;
+ goto errout;
}
-
+
jfs_debug(1, "Using journal file %s\n", journal_name);
io_ptr = unix_io_manager;
}
retval = EXT2_ET_LOAD_EXT_JOURNAL;
goto errout;
}
-
+
journal->j_maxlen = jsuper.s_blocks_count;
start++;
}
retval = EXT2_ET_NO_MEMORY;
goto errout;
}
-
+
journal->j_sb_buffer = bh;
journal->j_superblock = (journal_superblock_t *)bh->b_data;
-
+
#ifdef USE_INODE_IO
if (j_inode)
ext2fs_free_mem(&j_inode);
if (journal)
ext2fs_free_mem(&journal);
return retval;
-
}
static errcode_t e2fsck_journal_fix_bad_inode(e2fsck_t ctx,