[PATCH] erofs-utils: fix a memory leak of multiple devices
Yue Hu
huyue2 at coolpad.com
Fri Jul 22 12:49:37 AEST 2022
The memory allocated for multiple devices should be freed when to exit.
Let's add a helper to fix it since there is more than one to use it.
Signed-off-by: Yue Hu <huyue2 at coolpad.com>
---
dump/main.c | 7 ++++---
fsck/main.c | 7 ++++---
fuse/main.c | 5 +++--
include/erofs/internal.h | 1 +
lib/super.c | 6 ++++++
5 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/dump/main.c b/dump/main.c
index 40e850a..c9b3a8f 100644
--- a/dump/main.c
+++ b/dump/main.c
@@ -615,7 +615,7 @@ int main(int argc, char **argv)
err = erofs_read_superblock();
if (err) {
erofs_err("failed to read superblock");
- goto exit_dev_close;
+ goto exit_put_super;
}
if (!dumpcfg.totalshow) {
@@ -630,13 +630,14 @@ int main(int argc, char **argv)
if (dumpcfg.show_extent && !dumpcfg.show_inode) {
usage();
- goto exit_dev_close;
+ goto exit_put_super;
}
if (dumpcfg.show_inode)
erofsdump_show_fileinfo(dumpcfg.show_extent);
-exit_dev_close:
+exit_put_super:
+ erofs_put_super();
dev_close();
exit:
blob_closeall();
diff --git a/fsck/main.c b/fsck/main.c
index 5a2f659..a8f0e24 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -813,12 +813,12 @@ int main(int argc, char **argv)
err = erofs_read_superblock();
if (err) {
erofs_err("failed to read superblock");
- goto exit_dev_close;
+ goto exit_put_super;
}
if (erofs_sb_has_sb_chksum() && erofs_check_sb_chksum()) {
erofs_err("failed to verify superblock checksum");
- goto exit_dev_close;
+ goto exit_put_super;
}
err = erofsfsck_check_inode(sbi.root_nid, sbi.root_nid);
@@ -843,7 +843,8 @@ int main(int argc, char **argv)
}
}
-exit_dev_close:
+exit_put_super:
+ erofs_put_super();
dev_close();
exit:
blob_closeall();
diff --git a/fuse/main.c b/fuse/main.c
index 95f939e..95f7abc 100644
--- a/fuse/main.c
+++ b/fuse/main.c
@@ -295,11 +295,12 @@ int main(int argc, char *argv[])
ret = erofs_read_superblock();
if (ret) {
fprintf(stderr, "failed to read erofs super block\n");
- goto err_dev_close;
+ goto err_put_super;
}
ret = fuse_main(args.argc, args.argv, &erofs_ops, NULL);
-err_dev_close:
+err_put_super:
+ erofs_put_super();
blob_closeall();
dev_close();
err_fuse_free_args:
diff --git a/include/erofs/internal.h b/include/erofs/internal.h
index 6a70f11..48498fe 100644
--- a/include/erofs/internal.h
+++ b/include/erofs/internal.h
@@ -318,6 +318,7 @@ struct erofs_map_dev {
/* super.c */
int erofs_read_superblock(void);
+void erofs_put_super(void);
/* namei.c */
int erofs_read_inode_from_disk(struct erofs_inode *vi);
diff --git a/lib/super.c b/lib/super.c
index f486eb7..913d2fb 100644
--- a/lib/super.c
+++ b/lib/super.c
@@ -109,3 +109,9 @@ int erofs_read_superblock(void)
memcpy(&sbi.uuid, dsb->uuid, sizeof(dsb->uuid));
return erofs_init_devices(&sbi, dsb);
}
+
+void erofs_put_super(void)
+{
+ if (sbi.devs)
+ free(sbi.devs);
+}
--
2.17.1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linux-erofs/attachments/20220722/a7e04062/attachment.htm>
More information about the Linux-erofs
mailing list