在 2021/10/12 9:58, roger 写道:
From: Kees Cook
stable inclusion from stable-5.10 category: feature commit:e163fdb3f7f8c62dccf194f3f37a7bcb3c333aa8 issue: #I4919J
--------------------------------
In my attempt to fix a memory leak, I introduced a double-free in the pstore error path. Instead of trying to manage the allocation lifetime between persistent_ram_new() and its callers, adjust the logic so persistent_ram_new() always takes a kstrdup() copy, and leaves the caller's allocation lifetime up to the caller. Therefore callers are _always_ responsible for freeing their label. Before, it only needed freeing when the prz itself failed to allocate, and not in any of the other prz failure cases, which callers would have no visibility into, which is the root design problem that lead to both the leak and now double-free bugs.
Reported-by: Cengiz Can
Link: https://lore.kernel.org/lkml/d4ec59002ede4aaf9928c7f7526da87c@kernel.wtf Fixes: 8df955a32a73 ("pstore/ram: Fix error-path memory leak in persistent_ram_new() callers")
补丁修改适配没啥问题,为保持完整性,应该把该补丁解决的问题补丁也合进来。 8df955a32a73 ("pstore/ram: Fix error-path memory leak in persistent_ram_new() callers")
Cc: stable@vger.kernel.org Signed-off-by: Kees Cook
(cherry picked from commit e163fdb3f7f8c62dccf194f3f37a7bcb3c333aa8) Signed-off-by: roger --- fs/pstore/ram.c | 2 ++ fs/pstore/ram_core.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index f83639feb7dc..7a61743177ee 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -597,6 +597,7 @@ static int ramoops_init_przs(const char *name, prz_ar[i] = persistent_ram_new(*paddr, zone_sz, sig, &cxt->ecc_info, cxt->memtype, flags, label); + kfree(label); if (IS_ERR(prz_ar[i])) { err = PTR_ERR(prz_ar[i]); dev_err(dev, "failed to request %s mem region (0x%zx@0x%llx): %d\n", @@ -642,6 +643,7 @@ static int ramoops_init_prz(const char *name, label = kasprintf(GFP_KERNEL, "ramoops:%s", name); *prz = persistent_ram_new(*paddr, sz, sig, &cxt->ecc_info, cxt->memtype, PRZ_FLAG_ZAP_OLD, label); + kfree(label); if (IS_ERR(*prz)) { int err = PTR_ERR(*prz);
diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c index 8200debeb6b7..a908ed97a24c 100644 --- a/fs/pstore/ram_core.c +++ b/fs/pstore/ram_core.c @@ -573,7 +573,7 @@ struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, /* Initialize general buffer state. */ raw_spin_lock_init(&prz->buffer_lock); prz->flags = flags; - prz->label = label; + prz->label = kstrdup(label, GFP_KERNEL);
ret = persistent_ram_buffer_map(start, size, prz, memtype); if (ret)