From cc615e445899ad719b7b84babae0cf7907b2a3e3 Mon Sep 17 00:00:00 2001 From: "Eric Wong (Contractor, The Linux Foundation)" Date: Tue, 27 Mar 2018 20:09:06 +0000 Subject: 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. --- lib/PublicInbox/HTTP.pm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'lib/PublicInbox/HTTP.pm') 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: } } -- cgit v1.2.3-24-ge0c7