From 25ab8a45f76ac3bfeaeccf04c48781a752edbe28 Mon Sep 17 00:00:00 2001 From: Artem Bityutskiy Date: Wed, 20 Apr 2011 14:32:53 +0300 Subject: fs-tests: integck: free all allocated memory on exit Signed-off-by: Artem Bityutskiy --- tests/fs-tests/integrity/integck.c | 59 ++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index 9cb0403..e6f5b3b 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -111,12 +111,12 @@ static struct { unsigned int nospc_size_ok:1; unsigned int can_mmap:1; unsigned int is_rootfs:1; - const char *fstype; - const char *fsdev; - const char *mount_opts; + char *fstype; + char *fsdev; + char *mount_opts; unsigned long mount_flags; - const char *mount_point; - const char *test_dir; + char *mount_point; + char *test_dir; } fsinfo = { .nospc_size_ok = 1, .can_mmap = 1, @@ -2501,7 +2501,7 @@ static void get_tested_fs_info(void) fclose(f); fsinfo.fstype = dup_string(mntent->mnt_type); - fsinfo.fsdev = strdup(mntent->mnt_fsname); + fsinfo.fsdev = dup_string(mntent->mnt_fsname); parse_mount_options(mntent->mnt_opts); /* Get memory page size for 'mmap()' */ @@ -2629,6 +2629,42 @@ static int parse_opts(int argc, char * const argv[]) return 0; } +/* + * Free all the in-memory information about the tested file-system contents + * starting from sub-directory 'dir'. + */ +static void free_fs_info(struct dir_info *dir) +{ + struct dir_entry_info *entry; + + /* Now check each entry */ + while (dir->first) { + entry = dir->first; + if (entry->type == 'd') { + struct dir_info *d = entry->dir; + + remove_dir_entry(entry); + free_fs_info(d); + free(d); + } else if (entry->type == 'f') { + struct file_info *file = entry->file; + + remove_dir_entry(entry); + if (!file->links) { + free_writes_info(file); + free(file); + } + } else if (entry->type == 's') { + struct symlink_info *symlink = entry->symlink; + + remove_dir_entry(entry); + free(symlink->target_pathname); + free(symlink); + } else + assert(0); + } +} + int main(int argc, char *argv[]) { int ret; @@ -2650,5 +2686,16 @@ int main(int argc, char *argv[]) if (ret) return EXIT_FAILURE; + close_open_files(); + free_fs_info(top_dir); + free(top_dir->entry->name); + free(top_dir->entry); + free(top_dir); + + free(random_name_buf); + free(fsinfo.mount_point); + free(fsinfo.fstype); + free(fsinfo.fsdev); + free(fsinfo.test_dir); return EXIT_SUCCESS; } -- cgit v1.2.3