Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf/core: Exit early on perf_mmap() fail

When perf_mmap() fails to allocate a buffer, it still invokes the
event_mapped() callback of the related event. On X86 this might increase
the perf_rdpmc_allowed reference counter. But nothing undoes this as
perf_mmap_close() is never called in this case, which causes another
reference count leak.

Return early on failure to prevent that.

Fixes: 1e0fb9ec679c ("perf: Add pmu callbacks to track event mapping and unmapping")
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: stable@vger.kernel.org

+4 -2
+4 -2
kernel/events/core.c
··· 7138 7138 mutex_unlock(aux_mutex); 7139 7139 mutex_unlock(&event->mmap_mutex); 7140 7140 7141 + if (ret) 7142 + return ret; 7143 + 7141 7144 /* 7142 7145 * Since pinned accounting is per vm we cannot allow fork() to copy our 7143 7146 * vma. ··· 7148 7145 vm_flags_set(vma, VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP); 7149 7146 vma->vm_ops = &perf_mmap_vmops; 7150 7147 7151 - if (!ret) 7152 - ret = map_range(rb, vma); 7148 + ret = map_range(rb, vma); 7153 7149 7154 7150 mapped = get_mapped(event, event_mapped); 7155 7151 if (mapped)