]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
IBM Z: Do not check inflateGetDictionary() with DFLTCC
authorIlya Leoshkevich <iii@linux.ibm.com>
Mon, 11 Oct 2021 11:47:20 +0000 (13:47 +0200)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Fri, 24 Dec 2021 11:52:14 +0000 (12:52 +0100)
The zlib manual does not specify a strict contract for
inflateGetDictionary(), it merely says that it "Returns the sliding
dictionary being maintained by inflate", which is an implementation
detail. IBM Z inflate's behavior differs from that of software, and
may change in the future to boot.

test/example.c

index d6cd4c9f7e48c5daee3a5d2e660dde6d5b3295d6..c31d1cf5e7c6dc477afe2a6aec0e25afb28e113b 100644 (file)
@@ -29,6 +29,9 @@ static const char hello[] = "hello, hello!";
 static const char dictionary[] = "hello";
 static unsigned long dictId = 0; /* Adler32 value of the dictionary */
 
+/* Maximum dictionary size, according to inflateGetDictionary() description. */
+#define MAX_DICTIONARY_SIZE 32768
+
 
 void test_compress      (unsigned char *compr, z_size_t comprLen,unsigned char *uncompr, z_size_t uncomprLen);
 void test_gzio          (const char *fname, unsigned char *uncompr, z_size_t uncomprLen);
@@ -514,7 +517,7 @@ void test_dict_deflate(unsigned char *compr, size_t comprLen) {
  */
 void test_dict_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) {
     int err;
-    uint8_t check_dictionary[10];
+    uint8_t check_dictionary[MAX_DICTIONARY_SIZE];
     uint32_t check_dictionary_len = 0;
     PREFIX3(stream) d_stream; /* decompression stream */
 
@@ -547,13 +550,17 @@ void test_dict_inflate(unsigned char *compr, size_t comprLen, unsigned char *unc
     
     err = PREFIX(inflateGetDictionary)(&d_stream, NULL, &check_dictionary_len);
     CHECK_ERR(err, "inflateGetDictionary");
+#ifndef S390_DFLTCC_INFLATE
     if (check_dictionary_len != sizeof(dictionary))
         error("bad dictionary length\n");
+#endif
     
     err = PREFIX(inflateGetDictionary)(&d_stream, check_dictionary, &check_dictionary_len);
     CHECK_ERR(err, "inflateGetDictionary");
+#ifndef S390_DFLTCC_INFLATE
     if (memcmp(dictionary, check_dictionary, sizeof(dictionary)) != 0)
         error("bad dictionary\n");
+#endif
 
     err = PREFIX(inflateEnd)(&d_stream);
     CHECK_ERR(err, "inflateEnd");