mirror of
https://github.com/torvalds/linux
synced 2024-09-06 09:51:23 +00:00
ubifs: Fix memory leak of bud->log_hash
Ensure that the allocated bud->log_hash (if any) is freed in all cases
when the bud itself is freed, to fix this leak caught by kmemleak:
# keyctl add logon foo:bar data @s
# echo clear > /sys/kernel/debug/kmemleak
# mount -t ubifs /dev/ubi0_0 mnt -o auth_hash_name=sha256,auth_key=foo:bar
# echo a > mnt/x
# umount mnt
# mount -t ubifs /dev/ubi0_0 mnt -o auth_hash_name=sha256,auth_key=foo:bar
# umount mnt
# sleep 5
# echo scan > /sys/kernel/debug/kmemleak
# echo scan > /sys/kernel/debug/kmemleak
# cat /sys/kernel/debug/kmemleak
unreferenced object 0xff... (size 128):
comm "mount"
backtrace:
__kmalloc
__ubifs_hash_get_desc+0x5d/0xe0 ubifs
ubifs_replay_journal
ubifs_mount
...
Fixes: da8ef65f95
("ubifs: Authenticate replayed journal")
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
48ec6328de
commit
f4a04c97fb
|
@ -923,8 +923,10 @@ static void free_buds(struct ubifs_info *c)
|
|||
{
|
||||
struct ubifs_bud *bud, *n;
|
||||
|
||||
rbtree_postorder_for_each_entry_safe(bud, n, &c->buds, rb)
|
||||
rbtree_postorder_for_each_entry_safe(bud, n, &c->buds, rb) {
|
||||
kfree(bud->log_hash);
|
||||
kfree(bud);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1193,6 +1195,7 @@ static void destroy_journal(struct ubifs_info *c)
|
|||
|
||||
bud = list_entry(c->old_buds.next, struct ubifs_bud, list);
|
||||
list_del(&bud->list);
|
||||
kfree(bud->log_hash);
|
||||
kfree(bud);
|
||||
}
|
||||
ubifs_destroy_idx_gc(c);
|
||||
|
|
Loading…
Reference in a new issue