From a1f642728fe6fd2c361343fec349808ea8a524f4 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Fri, 6 Apr 2007 23:28:30 -0400 Subject: [PATCH] Fix memory leaks from using the tdb library We weren't freeing allocated memory from calls to tdb_fetch, tdb_firstkey, and tdb_nextkey. Oops. Signed-off-by: "Theodore Ts'o" --- e2fsck/dirinfo.c | 12 +++++++++--- lib/ext2fs/icount.c | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/e2fsck/dirinfo.c b/e2fsck/dirinfo.c index e0232896..487a0864 100644 --- a/e2fsck/dirinfo.c +++ b/e2fsck/dirinfo.c @@ -205,6 +205,7 @@ static struct dir_info *e2fsck_get_dir_info(e2fsck_t ctx, ext2_ino_t ino) #ifdef DIRINFO_DEBUG printf("(%d,%d,%d)\n", ino, buf->dotdot, buf->parent); #endif + free(data.dptr); return &ret_dir_info; } @@ -324,6 +325,8 @@ extern struct dir_info_iter *e2fsck_dir_info_iter_begin(e2fsck_t ctx) extern void e2fsck_dir_info_iter_end(e2fsck_t ctx, struct dir_info_iter *iter) { + if (iter->tdb_iter.dptr) + free(iter->tdb_iter.dptr); ext2fs_free_mem(&iter); } @@ -332,7 +335,7 @@ extern void e2fsck_dir_info_iter_end(e2fsck_t ctx, */ struct dir_info *e2fsck_dir_info_iter(e2fsck_t ctx, struct dir_info_iter *iter) { - TDB_DATA data; + TDB_DATA data, key; struct dir_info_db *db = ctx->dir_info; struct dir_info_ent *buf; static struct dir_info ret_dir_info; @@ -343,7 +346,8 @@ struct dir_info *e2fsck_dir_info_iter(e2fsck_t ctx, struct dir_info_iter *iter) if (db->tdb) { if (iter->tdb_iter.dptr == 0) return 0; - data = tdb_fetch(db->tdb, iter->tdb_iter); + key = iter->tdb_iter; + data = tdb_fetch(db->tdb, key); if (!data.dptr) { printf("iter fetch failed: %s\n", tdb_errorstr(db->tdb)); @@ -353,7 +357,9 @@ struct dir_info *e2fsck_dir_info_iter(e2fsck_t ctx, struct dir_info_iter *iter) ret_dir_info.ino = *((ext2_ino_t *) iter->tdb_iter.dptr); ret_dir_info.dotdot = buf->dotdot; ret_dir_info.parent = buf->parent; - iter->tdb_iter = tdb_nextkey(db->tdb, iter->tdb_iter); + iter->tdb_iter = tdb_nextkey(db->tdb, key); + free(key.dptr); + free(data.dptr); return &ret_dir_info; } diff --git a/lib/ext2fs/icount.c b/lib/ext2fs/icount.c index 4d894ac2..d1e11ae0 100644 --- a/lib/ext2fs/icount.c +++ b/lib/ext2fs/icount.c @@ -444,6 +444,7 @@ static errcode_t get_inode_count(ext2_icount_t icount, ext2_ino_t ino, } *count = *((__u16 *) data.dptr); + free(data.dptr); return 0; } el = get_icount_el(icount, ino, 0);