diff options
author | Eric Wong <e@yhbt.net> | 2020-07-06 06:11:02 +0000 |
---|---|---|
committer | Eric Wong <e@yhbt.net> | 2020-07-06 20:01:15 +0000 |
commit | 2c6e8b10e3f9f3b047009126426ce634c8f29a23 (patch) | |
tree | 81d81d92320de52fbe432e719622d2fc26789819 /lib/PublicInbox | |
parent | 89ac7eca5e1d17d7dc949b2fd0a59a5e83abf90f (diff) | |
download | public-inbox-2c6e8b10e3f9f3b047009126426ce634c8f29a23.tar.gz |
git_async_cat: unref pipes on EOF from git->cleanup
We avoided a managed circular reference in 10ee3548084c125f but introduced a pipe FD leak, instead. So handle the EOF we get when the "git cat-file --batch" process exits and closes its stdout FD. v2: remove ->close entirely. PublicInbox::Git->cleanup handles all cleanup. This prevents us from inadvertantly deleting the {async_cat} field associated with a different pipe than the one GAC is monitoring. Fixes: 10ee3548084c125f ("git_async_cat: remove circular reference")
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r-- | lib/PublicInbox/GitAsyncCat.pm | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/lib/PublicInbox/GitAsyncCat.pm b/lib/PublicInbox/GitAsyncCat.pm index 0b777204..e618d366 100644 --- a/lib/PublicInbox/GitAsyncCat.pm +++ b/lib/PublicInbox/GitAsyncCat.pm @@ -24,7 +24,8 @@ sub _add { sub event_step { my ($self) = @_; - my $git = $self->{git} or return; # ->close-ed + my $git = $self->{git}; + return $self->close if ($git->{in} // 0) != ($self->{sock} // 1); my $inflight = $git->{inflight}; if ($inflight && @$inflight) { $git->cat_async_step($inflight); @@ -32,14 +33,6 @@ sub event_step { } } -sub close { - my ($self) = @_; - if (my $git = delete $self->{git}) { - delete $git->{async_cat}; - } - $self->SUPER::close; # PublicInbox::DS::close -} - sub git_async_cat ($$$$) { my ($git, $oid, $cb, $arg) = @_; $git->cat_async($oid, $cb, $arg); |