71 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From d09bb1ab8ef9bb91457c0ead09589e8807489260 Mon Sep 17 00:00:00 2001
 | |
| From: Ondrej Dubaj <odubaj@redhat.com>
 | |
| Date: Thu, 6 Aug 2020 08:09:53 +0200
 | |
| Subject: [PATCH] Permit a deflateParams() parameter change.
 | |
| 
 | |
| This change allows a parameter change even if the input data has
 | |
| not all been compressed and copied to the application output
 | |
| buffer, so long as all of the input data has been compressed to
 | |
| the internal pending output buffer. This also allows an immediate
 | |
| deflateParams change so long as there have been no deflate calls
 | |
| since initialization or reset.
 | |
| ---
 | |
|  deflate.c |  6 +++---
 | |
|  zlib.h    | 11 ++++++-----
 | |
|  2 files changed, 9 insertions(+), 8 deletions(-)
 | |
| 
 | |
| diff --git a/deflate.c b/deflate.c
 | |
| index 9705c1c..f3c9924 100644
 | |
| --- a/deflate.c
 | |
| +++ b/deflate.c
 | |
| @@ -509,7 +509,7 @@ int ZEXPORT deflateResetKeep (strm)
 | |
|          s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
 | |
|  #endif
 | |
|          adler32(0L, Z_NULL, 0);
 | |
| -    s->last_flush = Z_NO_FLUSH;
 | |
| +    s->last_flush = -2;
 | |
|  
 | |
|      _tr_init(s);
 | |
|  
 | |
| @@ -606,13 +606,13 @@ int ZEXPORT deflateParams(strm, level, strategy)
 | |
|      func = configuration_table[s->level].func;
 | |
|  
 | |
|      if ((strategy != s->strategy || func != configuration_table[level].func ||
 | |
| -        hook_flush != Z_NO_FLUSH) && s->high_water) {
 | |
| +        hook_flush != Z_NO_FLUSH) && s->last_flush != -2) {
 | |
|          /* Flush the last buffer: */
 | |
|          int err = deflate(strm, RANK(hook_flush) > RANK(Z_BLOCK) ?
 | |
|                            hook_flush : Z_BLOCK); 
 | |
|          if (err == Z_STREAM_ERROR)
 | |
|              return err;
 | |
| -        if (strm->avail_out == 0)
 | |
| +        if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead)
 | |
|              return Z_BUF_ERROR;
 | |
|      }
 | |
|      if (s->level != level) {
 | |
| diff --git a/zlib.h b/zlib.h
 | |
| index f09cdaf..001624e 100644
 | |
| --- a/zlib.h
 | |
| +++ b/zlib.h
 | |
| @@ -712,11 +712,12 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
 | |
|     used to switch between compression and straight copy of the input data, or
 | |
|     to switch to a different kind of input data requiring a different strategy.
 | |
|     If the compression approach (which is a function of the level) or the
 | |
| -   strategy is changed, and if any input has been consumed in a previous
 | |
| -   deflate() call, then the input available so far is compressed with the old
 | |
| -   level and strategy using deflate(strm, Z_BLOCK).  There are three approaches
 | |
| -   for the compression levels 0, 1..3, and 4..9 respectively.  The new level
 | |
| -   and strategy will take effect at the next call of deflate().
 | |
| +   strategy is changed, and if there have been any deflate() calls since the
 | |
| +   state was initialized or reset, then the input available so far is
 | |
| +   compressed with the old level and strategy using deflate(strm, Z_BLOCK).
 | |
| +   There are three approaches for the compression levels 0, 1..3, and 4..9
 | |
| +   respectively.  The new level and strategy will take effect at the next call
 | |
| +   of deflate().
 | |
|  
 | |
|       If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does
 | |
|     not have enough output space to complete, then the parameter change will not
 | |
| -- 
 | |
| 2.26.0
 | |
| 
 |