Calling stream_t::destroy from the stream_t::on_read callback will block the thread in watcher_t::remove because the FD is currently "in callback". A similar issue was fixed in the lookip plugin with961409b668("lookip: Disconnect asynchronously to avoid dead-locking watcher unregistration"). Fixes:85ebf6abd4("whitelist: Add error handling to socket reads and fix a memory leak")