From 395406118cb22b4cfa3a83c2b3a3a9aa2627b708 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 27 May 2016 05:59:14 +0000 Subject: httpd/async: prevent circular reference We must avoid circular references which can cause leaks in long-running processes. This callback is dangerous since it may never be called to properly terminate everything. --- lib/PublicInbox/HTTPD/Async.pm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index 47ba27d2..b00e6370 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -10,6 +10,7 @@ use strict; use warnings; use base qw(Danga::Socket); use fields qw(cb cleanup); +use Scalar::Util qw(weaken); require PublicInbox::EvCleanup; sub new { @@ -25,11 +26,12 @@ sub new { sub async_pass { my ($self, $io, $fh, $bref) = @_; - my $restart_read = sub { $self->watch_read(1) }; # In case the client HTTP connection ($io) dies, it # will automatically close this ($self) object. $io->{forward} = $self; $fh->write($$bref); + weaken($self); + my $restart_read = sub { $self->watch_read(1) }; $self->{cb} = sub { my $r = sysread($self->{sock}, $$bref, 8192); if ($r) { -- cgit v1.2.3-24-ge0c7