CVE-2022-49607

Source
https://cve.org/CVERecord?id=CVE-2022-49607
Import Source
https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2022-49607.json
JSON Data
https://api.test.osv.dev/v1/vulns/CVE-2022-49607
Downstream
Related
Published
2025-02-26T02:23:31.823Z
Modified
2026-03-20T12:24:40.850731Z
Severity
  • 4.7 (Medium) CVSS_V3 - CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H CVSS Calculator
Summary
perf/core: Fix data race between perf_event_set_output() and perf_mmap_close()
Details

In the Linux kernel, the following vulnerability has been resolved:

perf/core: Fix data race between perfeventsetoutput() and perfmmap_close()

Yang Jihing reported a race between perfeventsetoutput() and perfmmap_close():

CPU1                    CPU2

perf_mmap_close(e2)
  if (atomic_dec_and_test(&e2->rb->mmap_count)) // 1 - > 0
    detach_rest = true

                    ioctl(e1, IOC_SET_OUTPUT, e2)
                      perf_event_set_output(e1, e2)

  ...
  list_for_each_entry_rcu(e, &e2->rb->event_list, rb_entry)
    ring_buffer_attach(e, NULL);
    // e1 isn't yet added and
    // therefore not detached

                        ring_buffer_attach(e1, e2->rb)
                          list_add_rcu(&e1->rb_entry,
                               &e2->rb->event_list)

After this; e1 is attached to an unmapped rb and a subsequent perf_mmap() will loop forever more:

again:
    mutex_lock(&e->mmap_mutex);
    if (event->rb) {
        ...
        if (!atomic_inc_not_zero(&e->rb->mmap_count)) {
            ...
            mutex_unlock(&e->mmap_mutex);
            goto again;
        }
    }

The loop in perfmmapclose() holds e2->mmapmutex, while the attach in perfeventsetoutput() holds e1->mmap_mutex. As such there is no serialization to avoid this race.

Change perfeventsetoutput() to take both e1->mmapmutex and e2->mmapmutex to alleviate that problem. Additionally, have the loop in perfmmap() detach the rb directly, this avoids having to wait for the concurrent perfmmapclose() to get around to doing it to make progress.

Database specific
{
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2022/49xxx/CVE-2022-49607.json",
    "cna_assigner": "Linux"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
9bb5d40cd93c9dd4be74834b1dcb1ba03629716b
Fixed
3bbd868099287ff9027db59029b502fcfa2202a0
Fixed
f836f9ac95df15f1e0af4beb0ec20021e8c91998
Fixed
17f5417194136517ee9bbd6511249e5310e5617c
Fixed
98c3c8fd0d4c560e0f8335b79c407bbf7fc9462c
Fixed
43128b3eee337824158f34da6648163d2f2fb937
Fixed
da3c256e2d0ebc87c7db0c605c9692b6f1722074
Fixed
a9391ff7a7c5f113d6f2bf6621d49110950de49c
Fixed
68e3c69803dada336893640110cb87221bb01dcf
Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
0 Unknown introduced commit / All previous commits are affected
Last affected
2487f0db30527032c4d56fc2d0b1a240fe89fef8
Last affected
703197b61d05f5edae54bad3256901c5a5c8794c
Last affected
c52217e88ae0f3a4ae00562d86e338f8f85969b4

Database specific

source
"https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2022-49607.json"