]> Sergey Matveev's repositories - public-inbox.git/commitdiff
DS: epoll: fix misordered EPOLL_CTL_DEL call
authorEric Wong <e@80x24.org>
Wed, 8 May 2019 19:04:17 +0000 (19:04 +0000)
committerEric Wong <e@80x24.org>
Wed, 8 May 2019 19:04:17 +0000 (19:04 +0000)
Any operations on an fd after POSIX::close() are invalid, so
epoll_ctl will fail.  Worse off, in a multi-threaded Perl, the
fd may be reused by another thread and EPOLL_CTL_DEL can hit the
wrong file description as a result.

cf. https://rt.cpan.org/Ticket/Display.html?id=129487

lib/PublicInbox/DS.pm

index c03bd5dd097348648d5da145a8cd1e591e169abe..779215c93e518bd0f29467285d505cc4d7d8596b 100644 (file)
@@ -333,8 +333,8 @@ sub EpollEventLoop {
                 } else {
                     my $fd = $ev->[0];
                     warn "epoll() returned fd $fd w/ state $state for which we have no mapping.  removing.\n";
-                    POSIX::close($fd);
                     epoll_ctl($Epoll, EPOLL_CTL_DEL, $fd, 0);
+                    POSIX::close($fd);
                 }
                 next;
             }