[njs] Zlib: fixed inflate().

Dmitry Volyntsev xeioex at nginx.com
Tue Apr 23 01:09:21 UTC 2024


details:   https://hg.nginx.org/njs/rev/d640adf691a7
branches:  
changeset: 2319:d640adf691a7
user:      Dmitry Volyntsev <xeioex at nginx.com>
date:      Mon Apr 22 17:52:06 2024 -0700
description:
Zlib: fixed inflate().

Previously, the function might fail to return the last part of the
compressed content. This problem is more visible when output size > 1024
or when chunkSize < the content size.

diffstat:

 external/njs_zlib_module.c |  2 +-
 src/test/njs_unit_test.c   |  7 +++++++
 2 files changed, 8 insertions(+), 1 deletions(-)

diffs (29 lines):

diff -r be271e8d0b3b -r d640adf691a7 external/njs_zlib_module.c
--- a/external/njs_zlib_module.c	Mon Apr 22 17:51:45 2024 -0700
+++ b/external/njs_zlib_module.c	Mon Apr 22 17:52:06 2024 -0700
@@ -463,7 +463,7 @@ njs_zlib_ext_inflate(njs_vm_t *vm, njs_v
 
     njs_chb_init(&chain, njs_vm_memory_pool(vm));
 
-    while (stream.avail_in > 0) {
+    while (rc != Z_STREAM_END) {
         stream.next_out = njs_chb_reserve(&chain, chunk_size);
         if (njs_slow_path(stream.next_out == NULL)) {
             njs_vm_memory_error(vm);
diff -r be271e8d0b3b -r d640adf691a7 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c	Mon Apr 22 17:51:45 2024 -0700
+++ b/src/test/njs_unit_test.c	Mon Apr 22 17:52:06 2024 -0700
@@ -22352,6 +22352,13 @@ static njs_unit_test_t  njs_zlib_test[] 
       njs_str("eJwLd/R2BAAC+gEl,eJw7t/HcpnObAQ/sBIE=") },
 
     { njs_str("const zlib = require('zlib');"
+              "const buf = 'αβγ'.repeat(56);"
+              "const enc = zlib.deflateRawSync(buf, {chunkSize:64}).toString('base64');"
+              "const dec = zlib.inflateRawSync(Buffer.from(enc, 'base64')).toString();"
+              "buf == dec"),
+      njs_str("true") },
+
+    { njs_str("const zlib = require('zlib');"
               "['WAKA'.repeat(1024), 'αβγ'.repeat(1024)]"
               ".map(v => [v, zlib.deflateRawSync(v).toString('base64')])"
               ".every(pair => pair[0] == zlib.inflateRawSync(Buffer.from(pair[1], 'base64')).toString())"),


More information about the nginx-devel mailing list