Mercurial > prosody-hg
changeset 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 | 573ac422ca1d |
| children | a331cde41c85 |
| files | util-src/signal.c |
| diffstat | 1 files changed, 3 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/util-src/signal.c Mon May 25 15:23:48 2026 +0100 +++ b/util-src/signal.c Mon May 25 16:02:39 2026 +0100 @@ -498,9 +498,10 @@ return 1; } - for(int i = signalfd_num; i > 0; i--) { + for(int i = signalfd_num - 1; i >= 0; i--) { if(signalfds[i].fd == sfd->fd) { - signalfds[i] = signalfds[signalfd_num--]; + signalfds[i] = signalfds[--signalfd_num]; + break; } }
