From f3416dbbc14b76235242c4937396438abc4d1c63 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 18 Jan 2017 07:35:35 +0000 Subject: http: cast a wider net to prevent circular references We can more effectly nuke circular references by clearing the entire PSGI $env, not just particular keys, when there are self-referential fields such as "qspawn.response" in our environment. --- lib/PublicInbox/HTTP.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 3530f8ba..8ba41ba5 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -241,6 +241,7 @@ sub response_done_cb ($$) { sub { my $env = $self->{env}; $self->{env} = undef; + %$env = () if $env; # prevent circular references $self->write("0\r\n\r\n") if $alive == 2; $self->write(sub{$alive ? next_request($self) : $self->close}); } @@ -472,7 +473,7 @@ sub close { my $self = shift; my $forward = $self->{forward}; my $env = $self->{env}; - delete $env->{'psgix.io'} if $env; # prevent circular references + %$env = () if $env; # prevent circular references $self->{pull} = $self->{forward} = $self->{env} = undef; if ($forward) { eval { $forward->close }; -- cgit v1.2.3-24-ge0c7