Protect subrequests from post-complete messages user/berick/safer-subrequest-respond-complete-signoff
authorMike Rylander <mrylander@gmail.com>
Thu, 16 May 2013 14:17:15 +0000 (10:17 -0400)
committerBill Erickson <berick@esilibrary.com>
Thu, 16 May 2013 20:26:11 +0000 (16:26 -0400)
Subrequests (AKA method_lookup()-based API calls) sometimes append
final-lvalue responses to the response list even after respond_complete()
has been called from within the implementation method.  This commit
discards all post-respond_complete values, protecting against extra,
spurious values being returned to the ultimate client.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
src/perl/lib/OpenSRF/AppSession.pm

index d19085f..fea28ee 100644 (file)
@@ -1076,15 +1076,22 @@ package OpenSRF::AppSubrequest;
 
 sub respond {
        my $self = shift;
+       return if $self->complete;
+
        my $resp = shift;
        push @{$$self{resp}}, $resp if (defined $resp);
 }
-sub respond_complete { respond(@_); }
+
+sub respond_complete {
+       my $self = shift;
+       $self->respond(@_);
+       $self->complete(1);
+}
 
 sub new {
        my $class = shift;
        $class = ref($class) || $class;
-       return bless({resp => [], @_}, $class);
+       return bless({complete => 0, resp => [], @_}, $class);
 }
 
 sub responses { @{$_[0]->{resp}} }
@@ -1096,6 +1103,13 @@ sub session {
        return $x->{session};
 }
 
+sub complete {
+       my $x = shift;
+       my $c = shift;
+       $x->{complete} = $c if ($c);
+       return $x->{complete};
+}
+
 sub status {}