Revision e163fdb3f7f8c62dccf194f3f37a7bcb3c333aa8 authored by Kees Cook on 08 January 2020, 18:06:54 UTC, committed by Kees Cook on 09 January 2020, 01:05:45 UTC
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 <cengiz@kernel.wtf> Link: https://lore.kernel.org/lkml/d4ec59002ede4aaf9928c7f7526da87c@kernel.wtf Fixes: 8df955a32a73 ("pstore/ram: Fix error-path memory leak in persistent_ram_new() callers") Cc: stable@vger.kernel.org Signed-off-by: Kees Cook <keescook@chromium.org>
1 parent 9e5f1c1
File | Mode | Size |
---|---|---|
kasan | ||
Kconfig | -rw-r--r-- | 24.1 KB |
Kconfig.debug | -rw-r--r-- | 4.7 KB |
Makefile | -rw-r--r-- | 3.9 KB |
backing-dev.c | -rw-r--r-- | 28.4 KB |
balloon_compaction.c | -rw-r--r-- | 8.2 KB |
cleancache.c | -rw-r--r-- | 9.8 KB |
cma.c | -rw-r--r-- | 14.3 KB |
cma.h | -rw-r--r-- | 573 bytes |
cma_debug.c | -rw-r--r-- | 4.5 KB |
compaction.c | -rw-r--r-- | 74.8 KB |
debug.c | -rw-r--r-- | 6.2 KB |
debug_page_ref.c | -rw-r--r-- | 1.4 KB |
dmapool.c | -rw-r--r-- | 13.8 KB |
early_ioremap.c | -rw-r--r-- | 6.8 KB |
fadvise.c | -rw-r--r-- | 5.4 KB |
failslab.c | -rw-r--r-- | 1.4 KB |
filemap.c | -rw-r--r-- | 96.6 KB |
frame_vector.c | -rw-r--r-- | 6.5 KB |
frontswap.c | -rw-r--r-- | 14.2 KB |
gup.c | -rw-r--r-- | 66.2 KB |
gup_benchmark.c | -rw-r--r-- | 2.7 KB |
highmem.c | -rw-r--r-- | 11.7 KB |
hmm.c | -rw-r--r-- | 19.0 KB |
huge_memory.c | -rw-r--r-- | 84.9 KB |
hugetlb.c | -rw-r--r-- | 135.1 KB |
hugetlb_cgroup.c | -rw-r--r-- | 10.9 KB |
hwpoison-inject.c | -rw-r--r-- | 2.8 KB |
init-mm.c | -rw-r--r-- | 1.2 KB |
internal.h | -rw-r--r-- | 17.7 KB |
interval_tree.c | -rw-r--r-- | 3.1 KB |
khugepaged.c | -rw-r--r-- | 55.0 KB |
kmemleak-test.c | -rw-r--r-- | 2.6 KB |
kmemleak.c | -rw-r--r-- | 56.0 KB |
ksm.c | -rw-r--r-- | 89.2 KB |
list_lru.c | -rw-r--r-- | 14.6 KB |
maccess.c | -rw-r--r-- | 7.9 KB |
madvise.c | -rw-r--r-- | 28.8 KB |
mapping_dirty_helpers.c | -rw-r--r-- | 9.6 KB |
memblock.c | -rw-r--r-- | 58.0 KB |
memcontrol.c | -rw-r--r-- | 185.6 KB |
memfd.c | -rw-r--r-- | 7.9 KB |
memory-failure.c | -rw-r--r-- | 51.5 KB |
memory.c | -rw-r--r-- | 127.7 KB |
memory_hotplug.c | -rw-r--r-- | 48.1 KB |
mempolicy.c | -rw-r--r-- | 74.7 KB |
mempool.c | -rw-r--r-- | 15.8 KB |
memremap.c | -rw-r--r-- | 12.2 KB |
memtest.c | -rw-r--r-- | 2.8 KB |
migrate.c | -rw-r--r-- | 76.2 KB |
mincore.c | -rw-r--r-- | 7.5 KB |
mlock.c | -rw-r--r-- | 22.7 KB |
mm_init.c | -rw-r--r-- | 4.8 KB |
mmap.c | -rw-r--r-- | 100.1 KB |
mmu_context.c | -rw-r--r-- | 1.3 KB |
mmu_gather.c | -rw-r--r-- | 6.7 KB |
mmu_notifier.c | -rw-r--r-- | 31.4 KB |
mmzone.c | -rw-r--r-- | 2.4 KB |
mprotect.c | -rw-r--r-- | 15.5 KB |
mremap.c | -rw-r--r-- | 19.4 KB |
msync.c | -rw-r--r-- | 2.7 KB |
nommu.c | -rw-r--r-- | 45.6 KB |
oom_kill.c | -rw-r--r-- | 30.1 KB |
page-writeback.c | -rw-r--r-- | 84.7 KB |
page_alloc.c | -rw-r--r-- | 240.8 KB |
page_counter.c | -rw-r--r-- | 6.6 KB |
page_ext.c | -rw-r--r-- | 10.9 KB |
page_idle.c | -rw-r--r-- | 5.5 KB |
page_io.c | -rw-r--r-- | 10.8 KB |
page_isolation.c | -rw-r--r-- | 9.2 KB |
page_owner.c | -rw-r--r-- | 16.0 KB |
page_poison.c | -rw-r--r-- | 3.0 KB |
page_vma_mapped.c | -rw-r--r-- | 7.6 KB |
pagewalk.c | -rw-r--r-- | 12.0 KB |
percpu-internal.h | -rw-r--r-- | 6.3 KB |
percpu-km.c | -rw-r--r-- | 3.0 KB |
percpu-stats.c | -rw-r--r-- | 5.7 KB |
percpu-vm.c | -rw-r--r-- | 10.3 KB |
percpu.c | -rw-r--r-- | 92.3 KB |
pgtable-generic.c | -rw-r--r-- | 5.6 KB |
process_vm_access.c | -rw-r--r-- | 9.8 KB |
readahead.c | -rw-r--r-- | 16.5 KB |
rmap.c | -rw-r--r-- | 55.0 KB |
rodata_test.c | -rw-r--r-- | 1.3 KB |
shmem.c | -rw-r--r-- | 107.6 KB |
shuffle.c | -rw-r--r-- | 5.7 KB |
shuffle.h | -rw-r--r-- | 1.5 KB |
slab.c | -rw-r--r-- | 105.5 KB |
slab.h | -rw-r--r-- | 19.3 KB |
slab_common.c | -rw-r--r-- | 44.6 KB |
slob.c | -rw-r--r-- | 18.0 KB |
slub.c | -rw-r--r-- | 143.4 KB |
sparse-vmemmap.c | -rw-r--r-- | 6.9 KB |
sparse.c | -rw-r--r-- | 25.4 KB |
swap.c | -rw-r--r-- | 30.4 KB |
swap_cgroup.c | -rw-r--r-- | 5.2 KB |
swap_slots.c | -rw-r--r-- | 9.4 KB |
swap_state.c | -rw-r--r-- | 22.4 KB |
swapfile.c | -rw-r--r-- | 95.0 KB |
truncate.c | -rw-r--r-- | 26.7 KB |
usercopy.c | -rw-r--r-- | 9.5 KB |
userfaultfd.c | -rw-r--r-- | 15.7 KB |
util.c | -rw-r--r-- | 22.2 KB |
vmacache.c | -rw-r--r-- | 2.7 KB |
vmalloc.c | -rw-r--r-- | 92.7 KB |
vmpressure.c | -rw-r--r-- | 13.9 KB |
vmscan.c | -rw-r--r-- | 124.9 KB |
vmstat.c | -rw-r--r-- | 51.9 KB |
workingset.c | -rw-r--r-- | 20.5 KB |
z3fold.c | -rw-r--r-- | 46.6 KB |
zbud.c | -rw-r--r-- | 18.2 KB |
zpool.c | -rw-r--r-- | 11.2 KB |
zsmalloc.c | -rw-r--r-- | 61.9 KB |
zswap.c | -rw-r--r-- | 34.2 KB |
Computing file changes ...