summaryrefslogtreecommitdiff
path: root/e2fsck/dirinfo.c
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2007-04-06 23:28:30 -0400
committerTheodore Ts'o <tytso@mit.edu>2007-04-06 23:28:30 -0400
commita1f642728fe6fd2c361343fec349808ea8a524f4 (patch)
tree50beac6443b89ad6fff4d7eeef3528d5a915e4d3 /e2fsck/dirinfo.c
parent25a9fe2894a147f5d0d2320357f78c7ff9de09e3 (diff)
downloade2fsprogs-a1f642728fe6fd2c361343fec349808ea8a524f4.tar.gz
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" <tytso@mit.edu>
Diffstat (limited to 'e2fsck/dirinfo.c')
-rw-r--r--e2fsck/dirinfo.c12
1 files changed, 9 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;
}