Commit 196b51f
committed
dialog: fix refcount race between BYE and timer expiry (GH-3835)
Two race paths between BYE processing and dlg_ontimeout() cause
use-after-free when bye_on_timeout is enabled (create_dialog("B")):
1. next_state_dlg() releases the hash lock before the caller removes
the dialog timer, allowing a concurrent worker to race on cleanup.
2. dlg_ontimeout() reads dlg->state without the hash lock, which on
ARM64 (relaxed memory ordering) can return a stale CONFIRMED value
after a BYE worker has already set DELETED.
Fix: move remove_dlg_timer() inside next_state_dlg()'s lock scope so
timer removal is atomic with the state transition, and read dlg->state
under the hash lock in dlg_ontimeout() so the timer handler sees
concurrent state changes.
Remove the now-redundant caller-side remove_dlg_timer() blocks from
dlg_onroute(), dual_bye_event(), dlg_replicated_delete(), and
drop_dlg().
Closes #38351 parent 6157557 commit 196b51f
File tree
4 files changed
+45
-91
lines changed- modules/dialog
4 files changed
+45
-91
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1889 | 1889 | | |
1890 | 1890 | | |
1891 | 1891 | | |
1892 | | - | |
| 1892 | + | |
1893 | 1893 | | |
1894 | 1894 | | |
1895 | 1895 | | |
| |||
2130 | 2130 | | |
2131 | 2131 | | |
2132 | 2132 | | |
2133 | | - | |
2134 | | - | |
2135 | | - | |
2136 | | - | |
2137 | | - | |
2138 | | - | |
2139 | | - | |
2140 | | - | |
2141 | | - | |
2142 | | - | |
2143 | | - | |
2144 | | - | |
2145 | | - | |
2146 | | - | |
2147 | | - | |
2148 | | - | |
2149 | | - | |
2150 | | - | |
2151 | | - | |
2152 | | - | |
2153 | | - | |
2154 | | - | |
2155 | | - | |
2156 | | - | |
2157 | | - | |
2158 | 2133 | | |
2159 | 2134 | | |
2160 | 2135 | | |
| |||
2452 | 2427 | | |
2453 | 2428 | | |
2454 | 2429 | | |
| 2430 | + | |
2455 | 2431 | | |
2456 | 2432 | | |
2457 | 2433 | | |
2458 | 2434 | | |
| 2435 | + | |
2459 | 2436 | | |
2460 | 2437 | | |
| 2438 | + | |
| 2439 | + | |
| 2440 | + | |
| 2441 | + | |
| 2442 | + | |
| 2443 | + | |
| 2444 | + | |
| 2445 | + | |
| 2446 | + | |
| 2447 | + | |
| 2448 | + | |
| 2449 | + | |
| 2450 | + | |
| 2451 | + | |
| 2452 | + | |
| 2453 | + | |
| 2454 | + | |
| 2455 | + | |
2461 | 2456 | | |
2462 | | - | |
| 2457 | + | |
2463 | 2458 | | |
2464 | 2459 | | |
2465 | 2460 | | |
| |||
2471 | 2466 | | |
2472 | 2467 | | |
2473 | 2468 | | |
2474 | | - | |
| 2469 | + | |
2475 | 2470 | | |
2476 | 2471 | | |
2477 | 2472 | | |
| |||
2494 | 2489 | | |
2495 | 2490 | | |
2496 | 2491 | | |
2497 | | - | |
| 2492 | + | |
2498 | 2493 | | |
2499 | 2494 | | |
2500 | 2495 | | |
| |||
2521 | 2516 | | |
2522 | 2517 | | |
2523 | 2518 | | |
2524 | | - | |
| 2519 | + | |
2525 | 2520 | | |
2526 | 2521 | | |
2527 | 2522 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1330 | 1330 | | |
1331 | 1331 | | |
1332 | 1332 | | |
| 1333 | + | |
| 1334 | + | |
| 1335 | + | |
| 1336 | + | |
| 1337 | + | |
| 1338 | + | |
| 1339 | + | |
| 1340 | + | |
| 1341 | + | |
| 1342 | + | |
| 1343 | + | |
| 1344 | + | |
| 1345 | + | |
| 1346 | + | |
| 1347 | + | |
| 1348 | + | |
| 1349 | + | |
1333 | 1350 | | |
1334 | 1351 | | |
1335 | 1352 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
599 | 599 | | |
600 | 600 | | |
601 | 601 | | |
602 | | - | |
| 602 | + | |
603 | 603 | | |
604 | 604 | | |
605 | 605 | | |
| |||
639 | 639 | | |
640 | 640 | | |
641 | 641 | | |
642 | | - | |
643 | | - | |
644 | | - | |
645 | | - | |
646 | | - | |
647 | | - | |
648 | | - | |
649 | | - | |
650 | | - | |
651 | | - | |
652 | | - | |
653 | | - | |
654 | | - | |
655 | | - | |
656 | | - | |
657 | | - | |
658 | | - | |
659 | | - | |
660 | | - | |
661 | | - | |
662 | | - | |
663 | | - | |
664 | | - | |
665 | | - | |
666 | 642 | | |
667 | 643 | | |
668 | 644 | | |
| |||
1200 | 1176 | | |
1201 | 1177 | | |
1202 | 1178 | | |
1203 | | - | |
| 1179 | + | |
1204 | 1180 | | |
1205 | 1181 | | |
1206 | 1182 | | |
| |||
1226 | 1202 | | |
1227 | 1203 | | |
1228 | 1204 | | |
1229 | | - | |
1230 | | - | |
1231 | | - | |
1232 | | - | |
1233 | | - | |
1234 | | - | |
1235 | | - | |
1236 | | - | |
1237 | | - | |
1238 | | - | |
1239 | | - | |
1240 | | - | |
1241 | | - | |
1242 | 1205 | | |
1243 | 1206 | | |
1244 | 1207 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
212 | 212 | | |
213 | 213 | | |
214 | 214 | | |
215 | | - | |
| 215 | + | |
216 | 216 | | |
217 | 217 | | |
218 | 218 | | |
| |||
233 | 233 | | |
234 | 234 | | |
235 | 235 | | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | | - | |
241 | | - | |
242 | | - | |
243 | | - | |
244 | | - | |
245 | | - | |
246 | | - | |
247 | | - | |
248 | | - | |
249 | | - | |
250 | | - | |
251 | | - | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | 236 | | |
258 | 237 | | |
259 | 238 | | |
| |||
0 commit comments