Mercurial > prosody-hg
comparison util-src/signal.c @ 14181:6fb6e383123f 13.0
util.signal: Fix signalfd closure on non-Linux systems
The loop was incorrect for 0-indexed arrays. It started at signalfd_num, which
is the total number of signalfds, and decremented to 1 (condition was >0). So
if 1 signalfd was registered, it would check only signalfds[1]. At capacity
(32 signalfds) it would read past the end of the array. In every case, it
would always skip the entry at position [0], leading to a leak.
The swap-with-tail removal of the matched item used the post-decrement
operator, leading to accessing the array slot just beyond the tail.
Finally, it didn't break after finding a match. Probably harmless, but there
isn't expected to be more than a single entry per fd, as far as I can tell.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 25 May 2026 16:02:39 +0100 |
| parents | 3118dc02f908 |
| children |
comparison
equal
deleted
inserted
replaced
| 14180:573ac422ca1d | 14181:6fb6e383123f |
|---|---|
| 496 if(close(sfd->write_fd) != 0) { | 496 if(close(sfd->write_fd) != 0) { |
| 497 lua_pushboolean(L, 0); | 497 lua_pushboolean(L, 0); |
| 498 return 1; | 498 return 1; |
| 499 } | 499 } |
| 500 | 500 |
| 501 for(int i = signalfd_num; i > 0; i--) { | 501 for(int i = signalfd_num - 1; i >= 0; i--) { |
| 502 if(signalfds[i].fd == sfd->fd) { | 502 if(signalfds[i].fd == sfd->fd) { |
| 503 signalfds[i] = signalfds[signalfd_num--]; | 503 signalfds[i] = signalfds[--signalfd_num]; |
| 504 break; | |
| 504 } | 505 } |
| 505 } | 506 } |
| 506 | 507 |
| 507 #endif | 508 #endif |
| 508 | 509 |
