hashtable is unfreed in case GRUB_AFFS_FILETYPE_HARDLINK if grub_disk_read failed. Because, if grub_affs_create_node return not zero, the hashtable should be freed. By the way hashtable is unused in grub_affs_create_node, so we can remove the parameter and take care of it in grub_affs_iterate_dir. (which one allocate the memory and it should be responsible for releasing)
This is why commit ebf32bc4e9(fs/affs: Fix resource leaks), missing this memory leak. Fixs: ebf32bc4e9(fs/affs: Fix resource leaks) Signed-off-by: "t.feng" <fengta...@huawei.com> --- grub-core/fs/affs.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/grub-core/fs/affs.c b/grub-core/fs/affs.c index 631d3d58a..ed606b3f1 100644 --- a/grub-core/fs/affs.c +++ b/grub-core/fs/affs.c @@ -321,7 +321,6 @@ static int grub_affs_create_node (grub_fshelp_node_t dir, grub_fshelp_iterate_dir_hook_t hook, void *hook_data, struct grub_fshelp_node **node, - grub_uint32_t **hashtable, grub_uint32_t block, const struct grub_affs_file *fil) { struct grub_affs_data *data = dir->data; @@ -332,10 +331,7 @@ grub_affs_create_node (grub_fshelp_node_t dir, *node = grub_zalloc (sizeof (**node)); if (!*node) - { - grub_free (*hashtable); - return 1; - } + return 1; (*node)->data = data; (*node)->block = block; @@ -395,7 +391,6 @@ grub_affs_create_node (grub_fshelp_node_t dir, if (hook ((char *) name_u8, type, *node, hook_data)) { - grub_free (*hashtable); *node = 0; return 1; } @@ -460,11 +455,11 @@ grub_affs_iterate_dir (grub_fshelp_node_t dir, if (grub_errno) goto fail; - if (grub_affs_create_node (dir, hook, hook_data, &node, &hashtable, - next, &file)) + if (grub_affs_create_node (dir, hook, hook_data, &node, next, &file)) { /* Node has been replaced in function. */ grub_free (orig_node); + grub_free (hashtable); return 1; } -- 2.27.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel