From: Eric Wong (Contractor, The Linux Foundation) Date: Tue, 27 Mar 2018 20:09:06 +0000 (+0000) Subject: http: fix modification of read-only value X-Git-Tag: v1.1.0-pre1~118 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=cc615e445899ad719b7b84babae0cf7907b2a3e3 http: fix modification of read-only value This fails in the rare case we get a partial send() on "\r\n" when writing chunked HTTP responses out. --- diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 3dd49be3..bc10814e 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -316,9 +316,12 @@ sub more ($$) { if (MSG_MORE && !$self->{write_buf_size}) { my $n = send($self->{sock}, $_[1], MSG_MORE); if (defined $n) { - my $dlen = length($_[1]); - return 1 if $n == $dlen; # all done! - $_[1] = substr($_[1], $n, $dlen - $n); + my $nlen = length($_[1]) - $n; + return 1 if $nlen == 0; # all done! + eval { $_[1] = substr($_[1], $n, $nlen) }; + if ($@) { # modification of read-only value: + return $self->write(substr($_[1], $n, $nlen)); + } # fall through to normal write: } }