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-Tag: osrf_rel_3_0_0-alpha~7 X-Git-Url: http://git.equinoxoli.org/?p=opensrf-equinox.git;a=commitdiff_plain;h=1f38166249e9f8fbb58ad21d1a00b935200a9278 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 Signed-off-by: Jason Stephenson --- 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")