Dne Ne 08.led.2017 08:45:54, PMQS napsal(a):
Show quoted text> Thanks, known issue.
>
> zlib-1.2.10 changed the API for the deflateParams function. Know how
> to fix it, just haven't got the fix completed yet.
>
I located the change in zlib-1.2.9 and after some difficulties, I implemented a change in the Compress-Raw-Zlib test. The tests pass with 1.2.8 as well as with 1.2.11.
I had some difficulties to with a fix by retrying deflateParams(), so chose flushing a stream. Maybe there is some issue with Compress-Raw-Zlib how to redefines stream positions. Or it can a real bug in zlib.
Also maybe you would like to add an implicit stream flush into
Perl's deflateParams() to achieve better compatibility with existing Compress::Raw::Zlib users. I did not do that.
From b42f5c088158f473116d3aca2d050d4efb95b021 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
Date: Tue, 7 Feb 2017 14:44:48 +0100
Subject: [PATCH] Adapt tests to zlib 1.2.11
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Since zlib-1.2.9 it's not safe to invoke deflateParams() when not all
input was consumed by deflate(). deflateParams() could return
Z_BUF_ERROR in some cases:
commit 7161ad76e2d0ac7de2a6235fcad3b9dfc99e9140
Author: Mark Adler <madler@alumni.caltech.edu>
Date: Tue Nov 22 23:29:19 2016 -0800
Assure that deflateParams() will not switch functions mid-block.
This alters the specification in zlib.h, so that deflateParams()
will not change any parameters if there is not enough output space
in the event that a block is emitted in order to allow switching
the compression function.
zlib documentation recommends two fixes:
To retry deflateParams() as it processes a piece of input underneath
until something else than Z_BUF_ERROR is returned. However this does
not work for me because then the compressed stream gets corrupted
and the subsequent inflate() returns a failure.
Another fix is to flush the deflated stream with Z_BLOCK just before
any deflateParams() call that follows unifinished deflate(). This
assures the new deflate options will be applied immediatelly on next
deflate() call. This fix works for me. Thus I implemented it in the
tests.
The new tests pass with zlib 1.2.8 as well as 1.2.11. 1.2.9 and 1.2.10
seems broken changing the deflate options was fixed in 1.2.11.
CPAN RT#119762
Signed-off-by: Petr PÃsaÅ <ppisar@redhat.com>
---
t/02zlib.t | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/t/02zlib.t b/t/02zlib.t
index 2c9aad6..50f6a82 100644
--- a/t/02zlib.t
+++ b/t/02zlib.t
@@ -24,13 +24,13 @@ BEGIN
my $count = 0 ;
if ($] < 5.005) {
- $count = 232 ;
+ $count = 236 ;
}
elsif ($] >= 5.006) {
- $count = 317 ;
+ $count = 320 ;
}
else {
- $count = 275 ;
+ $count = 278 ;
}
plan tests => $count + $extra;
@@ -537,6 +537,7 @@ SKIP:
$status = $x->deflate($hello, $Answer) ;
cmp_ok $status, '==', Z_OK ;
+ cmp_ok $x->flush($Answer, Z_BLOCK), '==', Z_OK ;
$input .= $hello;
# error cases
@@ -561,6 +562,7 @@ SKIP:
$status = $x->deflate($goodbye, $Answer) ;
cmp_ok $status, '==', Z_OK ;
+ cmp_ok $x->flush($Answer, Z_BLOCK), '==', Z_OK ;
$input .= $goodbye;
# change only Level
@@ -572,6 +574,7 @@ SKIP:
$status = $x->deflate($goodbye, $Answer) ;
cmp_ok $status, '==', Z_OK ;
+ cmp_ok $x->flush($Answer, Z_BLOCK), '==', Z_OK ;
$input .= $goodbye;
# change only Strategy
--
2.7.4