From 1f38166249e9f8fbb58ad21d1a00b935200a9278 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Thu, 14 Sep 2017 17:36:40 -0400 Subject: [PATCH] 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 --- src/perl/lib/OpenSRF/AppSession.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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") -- 2.43.2