Commit 5c86c89
xfrm: avoid lock inversion in nat keepalive work
commit 763fe70 upstream.
nat_keepalive_work() walks the state table while xfrm_state_walk()
holds net->xfrm.xfrm_state_lock. Its callback then acquires x->lock,
which conflicts with the delete path taking the same locks in reverse
order via xfrm_state_delete() and __xfrm_state_delete(). This creates
an AB-BA deadlock that is reported by lockdep when a NAT keepalive
worker races with SA deletion.
Fix this by splitting the keepalive walk into two phases. First,
collect the candidate states while the walk holds xfrm_state_lock and
take a reference on each state. Then, after the walk completes, process
each collected state and acquire x->lock without nesting it under
xfrm_state_lock.
Fixes: f531d13 ("xfrm: support sending NAT keepalives in ESP in UDP states")
Cc: stable@vger.kernel.org
Reported-by: Vega <vega@nebusec.ai>
Assisted-by: Codex:gpt-5.4
Signed-off-by: Zihan Xi <xizh2024@lzu.edu.cn>
Signed-off-by: Ren Wei <enjou1224z@gmail.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent 328e40a commit 5c86c89
1 file changed
Lines changed: 48 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
| 159 | + | |
159 | 160 | | |
160 | 161 | | |
161 | 162 | | |
162 | 163 | | |
163 | | - | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
164 | 170 | | |
165 | 171 | | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
166 | 190 | | |
167 | 191 | | |
168 | | - | |
| 192 | + | |
169 | 193 | | |
170 | 194 | | |
171 | 195 | | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
172 | 201 | | |
173 | 202 | | |
174 | | - | |
175 | | - | |
176 | | - | |
| 203 | + | |
177 | 204 | | |
178 | 205 | | |
179 | 206 | | |
| |||
187 | 214 | | |
188 | 215 | | |
189 | 216 | | |
190 | | - | |
| 217 | + | |
| 218 | + | |
191 | 219 | | |
192 | 220 | | |
193 | 221 | | |
194 | 222 | | |
195 | | - | |
| 223 | + | |
196 | 224 | | |
197 | | - | |
198 | 225 | | |
199 | 226 | | |
200 | 227 | | |
201 | 228 | | |
| 229 | + | |
202 | 230 | | |
203 | 231 | | |
204 | 232 | | |
| 233 | + | |
205 | 234 | | |
| 235 | + | |
206 | 236 | | |
207 | 237 | | |
208 | 238 | | |
209 | 239 | | |
210 | 240 | | |
211 | | - | |
| 241 | + | |
212 | 242 | | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
213 | 252 | | |
214 | 253 | | |
215 | 254 | | |
| |||
0 commit comments