UBUNTU-CVE-2025-21664
In the Linux kernel, the following vulnerability has been resolved: dm thin: make get_first_thin use rcu-safe list first function The documentation in rculist.h explains the absence of list_empty_rcu() and cautions programmers against relying on a list_empty() -> list_first() sequence in RCU safe code. This is because each of these functions performs its own READ_ONCE() of the list head. This can lead to a situation where the list_empty() sees a valid list entry, but the subsequent list_first() sees a different view of list head state after a modification. In the case of dm-thin, this author had a production box crash from a GP fault in the process_deferred_bios path. This function saw a valid list head in get_first_thin() but when it subsequently dereferenced that and turned it into a thin_c, it got the inside of the struct pool, since the list was now empty and referring to itself. The kernel on which this occurred printed both a warning about a refcount_t being saturated, and a UBSAN error for an out-of-bounds cpuid access in the queued spinlock, prior to the fault itself. When the resulting kdump was examined, it was possible to see another thread patiently waiting in thin_dtr's synchronize_rcu. The thin_dtr call managed to pull the thin_c out of the active thins list (and have it be the last entry in the active_thins list) at just the wrong moment which lead to this crash. Fortunately, the fix here is straight forward. Switch get_first_thin() function to use list_first_or_null_rcu() which performs just a single READ_ONCE() and returns NULL if the list is already empty. This was run against the devicemapper test suite's thin-provisioning suites for delete and suspend and no regressions were observed.
02 / AFFECTED SOFTWARE
Affected packages
18 explicit affected versions
98 explicit affected versions
19 explicit affected versions
10 explicit affected versions
11 explicit affected versions
43 explicit affected versions
60 explicit affected versions
18 explicit affected versions
59 explicit affected versions
50 explicit affected versions
6 explicit affected versions
12 explicit affected versions
19 explicit affected versions
6 explicit affected versions
69 explicit affected versions
23 explicit affected versions
54 explicit affected versions
72 explicit affected versions
62 explicit affected versions
55 explicit affected versions
10 explicit affected versions
14 explicit affected versions
21 explicit affected versions
61 explicit affected versions
7 explicit affected versions
100 explicit affected versions
13 explicit affected versions
85 explicit affected versions
20 explicit affected versions
35 explicit affected versions
21 explicit affected versions
19 explicit affected versions
18 explicit affected versions
20 explicit affected versions
118 explicit affected versions
64 explicit affected versions
23 explicit affected versions
102 explicit affected versions
1 explicit affected versions
1 explicit affected versions
13 explicit affected versions
4 explicit affected versions
121 explicit affected versions
23 explicit affected versions
28 explicit affected versions
21 explicit affected versions
16 explicit affected versions
57 explicit affected versions
24 explicit affected versions
2 explicit affected versions
7 explicit affected versions
12 explicit affected versions
111 explicit affected versions
1 explicit affected versions
52 explicit affected versions
12 explicit affected versions
14 explicit affected versions
7 explicit affected versions
2 explicit affected versions
89 explicit affected versions
12 explicit affected versions
105 explicit affected versions
113 explicit affected versions
12 explicit affected versions
1 explicit affected versions
100 explicit affected versions
120 explicit affected versions
15 explicit affected versions
15 explicit affected versions
10 explicit affected versions
10 explicit affected versions
37 explicit affected versions
2 explicit affected versions
13 explicit affected versions
16 explicit affected versions
10 explicit affected versions
37 explicit affected versions
26 explicit affected versions
13 explicit affected versions
144 explicit affected versions
12 explicit affected versions
1 explicit affected versions
29 explicit affected versions
93 explicit affected versions
13 explicit affected versions
66 explicit affected versions
17 explicit affected versions
18 explicit affected versions
1 explicit affected versions
87 explicit affected versions
61 explicit affected versions
105 explicit affected versions
24 explicit affected versions
33 explicit affected versions
23 explicit affected versions
10 explicit affected versions
1 explicit affected versions
188 explicit affected versions
11 explicit affected versions
12 explicit affected versions
7 explicit affected versions
12 explicit affected versions
103 explicit affected versions
138 explicit affected versions
2 explicit affected versions
52 explicit affected versions
46 explicit affected versions
132 explicit affected versions
62 explicit affected versions
165 explicit affected versions
154 explicit affected versions
10 explicit affected versions
13 explicit affected versions
3 explicit affected versions
26 explicit affected versions
22 explicit affected versions
38 explicit affected versions
1 explicit affected versions
23 explicit affected versions
13 explicit affected versions
23 explicit affected versions
139 explicit affected versions
63 explicit affected versions
16 explicit affected versions
63 explicit affected versions
26 explicit affected versions
53 explicit affected versions
116 explicit affected versions
93 explicit affected versions
1 explicit affected versions
1 explicit affected versions
2 explicit affected versions
70 explicit affected versions
51 explicit affected versions
92 explicit affected versions
9 explicit affected versions
20 explicit affected versions
12 explicit affected versions
49 explicit affected versions
27 explicit affected versions
36 explicit affected versions
1 explicit affected versions
1 explicit affected versions
8 explicit affected versions
26 explicit affected versions
5 explicit affected versions
8 explicit affected versions
1 explicit affected versions
10 explicit affected versions
7 explicit affected versions
22 explicit affected versions
13 explicit affected versions
92 explicit affected versions
13 explicit affected versions
56 explicit affected versions
3 explicit affected versions
140 explicit affected versions
2 explicit affected versions
94 explicit affected versions
54 explicit affected versions
10 explicit affected versions
12 explicit affected versions
15 explicit affected versions
91 explicit affected versions
44 explicit affected versions
16 explicit affected versions
13 explicit affected versions
26 explicit affected versions
45 explicit affected versions
37 explicit affected versions
27 explicit affected versions
14 explicit affected versions
38 explicit affected versions
167 explicit affected versions
53 explicit affected versions
9 explicit affected versions
7 explicit affected versions
51 explicit affected versions
11 explicit affected versions
17 explicit affected versions
7 explicit affected versions
62 explicit affected versions
33 explicit affected versions
97 explicit affected versions
64 explicit affected versions
121 explicit affected versions
4 explicit affected versions
1 explicit affected versions
1 explicit affected versions
1 explicit affected versions
60 explicit affected versions
13 explicit affected versions
43 explicit affected versions
58 explicit affected versions
10 explicit affected versions
8 explicit affected versions
21 explicit affected versions
14 explicit affected versions
92 explicit affected versions
4 explicit affected versions
78 explicit affected versions
11 explicit affected versions
1 explicit affected versions
69 explicit affected versions
16 explicit affected versions
03 / CONNECTIONS
Connected vulnerabilities
04 / EVIDENCE
Source records
In the Linux kernel, the following vulnerability has been resolved: dm thin: make get_first_thin use rcu-safe list first function The documentation in rculist.h explains the absence of list_empty_rcu() and cautions programmers against relying on a list_empty() -> list_first() sequence in RCU safe code. This is because each of these functions performs its own READ_ONCE() of the list head. This can lead to a situation where the list_empty() sees a valid list entry, but the subsequent list_first() sees a different view of list head state after a modification. In the case of dm-thin, this author had a production box crash from a GP fault in the process_deferred_bios path. This function saw a valid list head in get_first_thin() but when it subsequently dereferenced that and turned it into a thin_c, it got the inside of the struct pool, since the list was now empty and referring to itself. The kernel on which this occurred printed both a warning about a refcount_t being saturated, and a UBSAN error for an out-of-bounds cpuid access in the queued spinlock, prior to the fault itself. When the resulting kdump was examined, it was possible to see another thread patiently waiting in thin_dtr's synchronize_rcu. The thin_dtr call managed to pull the thin_c out of the active thins list (and have it be the last entry in the active_thins list) at just the wrong moment which lead to this crash. Fortunately, the fix here is straight forward. Switch get_first_thin() function to use list_first_or_null_rcu() which performs just a single READ_ONCE() and returns NULL if the list is already empty. This was run against the devicemapper test suite's thin-provisioning suites for delete and suspend and no regressions were observed.
05 / REFERENCES
Further evidence
- https://git.kernel.org/linus/80f130bfad1dab93b95683fc39b87235682b8f72
- https://git.kernel.org/stable/c/12771050b6d059eea096993bf2001da9da9fddff
- https://git.kernel.org/stable/c/6b305e98de0d225ccebfb225730a9f560d28ecb0
- https://git.kernel.org/stable/c/80f130bfad1dab93b95683fc39b87235682b8f72
- https://git.kernel.org/stable/c/cbd0d5ecfa390ac29c5380200147d09c381b2ac6
- https://ubuntu.com/security/CVE-2025-21664
- https://ubuntu.com/security/notices/USN-7379-1
- https://ubuntu.com/security/notices/USN-7379-2
- https://ubuntu.com/security/notices/USN-7380-1
- https://ubuntu.com/security/notices/USN-7381-1
- https://ubuntu.com/security/notices/USN-7382-1
- https://ubuntu.com/security/notices/USN-7387-1
- https://ubuntu.com/security/notices/USN-7387-2
- https://ubuntu.com/security/notices/USN-7387-3
- https://ubuntu.com/security/notices/USN-7388-1
- https://ubuntu.com/security/notices/USN-7389-1
- https://ubuntu.com/security/notices/USN-7390-1
- https://ubuntu.com/security/notices/USN-7391-1
- https://ubuntu.com/security/notices/USN-7392-1
- https://ubuntu.com/security/notices/USN-7392-2
- https://ubuntu.com/security/notices/USN-7392-3
- https://ubuntu.com/security/notices/USN-7392-4
- https://ubuntu.com/security/notices/USN-7393-1
- https://ubuntu.com/security/notices/USN-7401-1
- https://ubuntu.com/security/notices/USN-7407-1
- https://ubuntu.com/security/notices/USN-7413-1
- https://ubuntu.com/security/notices/USN-7421-1
- https://ubuntu.com/security/notices/USN-7458-1
- https://ubuntu.com/security/notices/USN-7459-1
- https://ubuntu.com/security/notices/USN-7459-2
- https://ubuntu.com/security/notices/USN-7463-1
- https://ubuntu.com/security/notices/USN-7513-1
- https://ubuntu.com/security/notices/USN-7513-2
- https://ubuntu.com/security/notices/USN-7513-3
- https://ubuntu.com/security/notices/USN-7513-4
- https://ubuntu.com/security/notices/USN-7513-5
- https://ubuntu.com/security/notices/USN-7514-1
- https://ubuntu.com/security/notices/USN-7515-1
- https://ubuntu.com/security/notices/USN-7515-2
- https://ubuntu.com/security/notices/USN-7522-1
- https://ubuntu.com/security/notices/USN-7523-1
- https://ubuntu.com/security/notices/USN-7524-1
- https://ubuntu.com/security/notices/USN-7539-1
- https://ubuntu.com/security/notices/USN-7540-1
- https://www.cve.org/CVERecord?id=CVE-2025-21664