Repository navigation
Commit 86b9ed5
committed
Fix pcntl_signal_dispatch() undoing the signal mask changes of its handlers
The dispatch blocked every signal while its handlers ran and then restored the
mask it found. A handler's pcntl_sigprocmask() was undone, and so was an
unblock done by pcntl_signal() (zend_sigaction()) or by an extension a handler
calls into, after which nothing unblocked that signal again. A signal such an
unblock let in during the handlers was lost: the end of the dispatch cleared
pending_signals, or overwrote the queue's head after a throwing handler, and
the engine interrupt it raised was spent on a nested dispatch that returned at
once.
Each handler now runs under the thread's own mask, and signals are blocked only
while the queue changes. A signal that arrives meanwhile stays queued, after
what a throwing handler left, and with async signals the engine is asked to
come back for it. A block an extension takes in a handler on a signal that was
not blocked before the dispatch now stays too.1 parent 357fcf1 commit 86b9ed5
5 files changed
Lines changed: 174 additions & 11 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1326 | 1326 | | |
1327 | 1327 | | |
1328 | 1328 | | |
| 1329 | + | |
1329 | 1330 | | |
1330 | 1331 | | |
1331 | 1332 | | |
| |||
1351 | 1352 | | |
1352 | 1353 | | |
1353 | 1354 | | |
| 1355 | + | |
| 1356 | + | |
| 1357 | + | |
| 1358 | + | |
1354 | 1359 | | |
1355 | 1360 | | |
1356 | 1361 | | |
| |||
1382 | 1387 | | |
1383 | 1388 | | |
1384 | 1389 | | |
| 1390 | + | |
1385 | 1391 | | |
| 1392 | + | |
1386 | 1393 | | |
1387 | 1394 | | |
1388 | 1395 | | |
| |||
1415 | 1422 | | |
1416 | 1423 | | |
1417 | 1424 | | |
1418 | | - | |
1419 | | - | |
1420 | | - | |
| 1425 | + | |
1421 | 1426 | | |
1422 | 1427 | | |
1423 | 1428 | | |
1424 | 1429 | | |
1425 | 1430 | | |
1426 | 1431 | | |
| 1432 | + | |
| 1433 | + | |
| 1434 | + | |
| 1435 | + | |
1427 | 1436 | | |
1428 | | - | |
| 1437 | + | |
1429 | 1438 | | |
1430 | | - | |
1431 | | - | |
1432 | | - | |
1433 | | - | |
1434 | | - | |
| 1439 | + | |
| 1440 | + | |
| 1441 | + | |
| 1442 | + | |
| 1443 | + | |
1435 | 1444 | | |
1436 | 1445 | | |
1437 | 1446 | | |
| |||
1440 | 1449 | | |
1441 | 1450 | | |
1442 | 1451 | | |
1443 | | - | |
1444 | | - | |
| 1452 | + | |
1445 | 1453 | | |
1446 | 1454 | | |
1447 | 1455 | | |
| |||
Lines changed: 33 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
Lines changed: 39 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
Lines changed: 54 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
Lines changed: 29 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
0 commit comments