From: Galen Charlton Date: Thu, 14 Sep 2017 21:36:40 +0000 (-0400) Subject: LP#1717350: fix chunking messages sent from Perl services X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=ae7ebb4f3ad2e33678e730304e181931e4a1cade;p=working%2FOpenSRF.git LP#1717350: fix chunking messages sent from Perl services The chunk size adjustments introduced by the patches for bug 1709710 could result in calculating non-integral chunk sizes for Perl services. This in turn led to fractional offsets and lengths being passed to Perl's substr() function; rounding in turn can lead to characters in the response getting silently dropped, which in turn broke parsing the reconstituted response. To test ------- The problem can be reproduced by invoking open-ils.storage open-ils.storage.actor.org_unit.descendants.atomic 1, 0 in Evergreen databases with org unit trees large enough that the response gets chunked. Signed-off-by: Galen Charlton --- diff --git a/src/perl/lib/OpenSRF/AppSession.pm b/src/perl/lib/OpenSRF/AppSession.pm index f7b3edf..b90e52c 100644 --- a/src/perl/lib/OpenSRF/AppSession.pm +++ b/src/perl/lib/OpenSRF/AppSession.pm @@ -13,6 +13,7 @@ use Exporter; use Encode; use base qw/Exporter OpenSRF/; use Time::HiRes qw( time usleep ); +use POSIX (); use warnings; use strict; @@ -1067,7 +1068,7 @@ sub respond { my $chunk_size = $self->max_chunk_size; if ($escaped_length > $self->max_chunk_size) { - $chunk_size = ($raw_length / $escaped_length) * $self->max_chunk_size; + $chunk_size = POSIX::floor(($raw_length / $escaped_length) * $self->max_chunk_size); } if ($raw_length > $chunk_size) { # send partials ("chunking")