Fossil SCM

fossil-scm / compat / zlib / FAQ
Source Blame History 371 lines
7ef7284… drh 1
7ef7284… drh 2 Frequently Asked Questions about zlib
7ef7284… drh 3
7ef7284… drh 4
7ef7284… drh 5 If your question is not there, please check the zlib home page
6ea30fb… florian 6 https://zlib.net/ which may have more recent information.
6ea30fb… florian 7 The latest zlib FAQ is at https://zlib.net/zlib_faq.html
7ef7284… drh 8
7ef7284… drh 9
7ef7284… drh 10 1. Is zlib Y2K-compliant?
7ef7284… drh 11
7ef7284… drh 12 Yes. zlib doesn't handle dates.
7ef7284… drh 13
7ef7284… drh 14 2. Where can I get a Windows DLL version?
7ef7284… drh 15
7ef7284… drh 16 The zlib sources can be compiled without change to produce a DLL. See the
64ce68d… drh 17 file win32/DLL_FAQ.txt in the zlib distribution.
7ef7284… drh 18
7ef7284… drh 19 3. Where can I get a Visual Basic interface to zlib?
7ef7284… drh 20
7ef7284… drh 21 See
6ea30fb… florian 22 * https://zlib.net/nelson/
7ef7284… drh 23 * win32/DLL_FAQ.txt in the zlib distribution
7ef7284… drh 24
7ef7284… drh 25 4. compress() returns Z_BUF_ERROR.
7ef7284… drh 26
7ef7284… drh 27 Make sure that before the call of compress(), the length of the compressed
7ef7284… drh 28 buffer is equal to the available size of the compressed buffer and not
7ef7284… drh 29 zero. For Visual Basic, check that this parameter is passed by reference
7ef7284… drh 30 ("as any"), not by value ("as long").
7ef7284… drh 31
7ef7284… drh 32 5. deflate() or inflate() returns Z_BUF_ERROR.
7ef7284… drh 33
7ef7284… drh 34 Before making the call, make sure that avail_in and avail_out are not zero.
7ef7284… drh 35 When setting the parameter flush equal to Z_FINISH, also make sure that
7ef7284… drh 36 avail_out is big enough to allow processing all pending input. Note that a
7ef7284… drh 37 Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
7ef7284… drh 38 made with more input or output space. A Z_BUF_ERROR may in fact be
7ef7284… drh 39 unavoidable depending on how the functions are used, since it is not
7ef7284… drh 40 possible to tell whether or not there is more output pending when
6ea30fb… florian 41 strm.avail_out returns with zero. See https://zlib.net/zlib_how.html for a
7ef7284… drh 42 heavily annotated example.
7ef7284… drh 43
7ef7284… drh 44 6. Where's the zlib documentation (man pages, etc.)?
7ef7284… drh 45
7ef7284… drh 46 It's in zlib.h . Examples of zlib usage are in the files test/example.c
7ef7284… drh 47 and test/minigzip.c, with more in examples/ .
7ef7284… drh 48
7ef7284… drh 49 7. Why don't you use GNU autoconf or libtool or ...?
7ef7284… drh 50
7ef7284… drh 51 Because we would like to keep zlib as a very small and simple package.
7ef7284… drh 52 zlib is rather portable and doesn't need much configuration.
7ef7284… drh 53
7ef7284… drh 54 8. I found a bug in zlib.
7ef7284… drh 55
7ef7284… drh 56 Most of the time, such problems are due to an incorrect usage of zlib.
7ef7284… drh 57 Please try to reproduce the problem with a small program and send the
7ef7284… drh 58 corresponding source to us at [email protected] . Do not send multi-megabyte
7ef7284… drh 59 data files without prior agreement.
7ef7284… drh 60
7ef7284… drh 61 9. Why do I get "undefined reference to gzputc"?
7ef7284… drh 62
7ef7284… drh 63 If "make test" produces something like
7ef7284… drh 64
7ef7284… drh 65 example.o(.text+0x154): undefined reference to `gzputc'
7ef7284… drh 66
7ef7284… drh 67 check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
7ef7284… drh 68 /usr/X11R6/lib. Remove any old versions, then do "make install".
7ef7284… drh 69
7ef7284… drh 70 10. I need a Delphi interface to zlib.
7ef7284… drh 71
7ef7284… drh 72 See the contrib/delphi directory in the zlib distribution.
7ef7284… drh 73
7ef7284… drh 74 11. Can zlib handle .zip archives?
7ef7284… drh 75
7ef7284… drh 76 Not by itself, no. See the directory contrib/minizip in the zlib
7ef7284… drh 77 distribution.
7ef7284… drh 78
7ef7284… drh 79 12. Can zlib handle .Z files?
7ef7284… drh 80
7ef7284… drh 81 No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
7ef7284… drh 82 the code of uncompress on your own.
7ef7284… drh 83
7ef7284… drh 84 13. How can I make a Unix shared library?
7ef7284… drh 85
7ef7284… drh 86 By default a shared (and a static) library is built for Unix. So:
7ef7284… drh 87
7ef7284… drh 88 make distclean
7ef7284… drh 89 ./configure
7ef7284… drh 90 make
7ef7284… drh 91
7ef7284… drh 92 14. How do I install a shared zlib library on Unix?
7ef7284… drh 93
7ef7284… drh 94 After the above, then:
7ef7284… drh 95
7ef7284… drh 96 make install
7ef7284… drh 97
7ef7284… drh 98 However, many flavors of Unix come with a shared zlib already installed.
7ef7284… drh 99 Before going to the trouble of compiling a shared version of zlib and
7ef7284… drh 100 trying to install it, you may want to check if it's already there! If you
7ef7284… drh 101 can #include <zlib.h>, it's there. The -lz option will probably link to
7ef7284… drh 102 it. You can check the version at the top of zlib.h or with the
7ef7284… drh 103 ZLIB_VERSION symbol defined in zlib.h .
7ef7284… drh 104
7ef7284… drh 105 15. I have a question about OttoPDF.
7ef7284… drh 106
7ef7284… drh 107 We are not the authors of OttoPDF. The real author is on the OttoPDF web
7ef7284… drh 108 site: Joel Hainley, [email protected].
7ef7284… drh 109
7ef7284… drh 110 16. Can zlib decode Flate data in an Adobe PDF file?
7ef7284… drh 111
6ea30fb… florian 112 Yes. See https://www.pdflib.com/ . To modify PDF forms, see
6ea30fb… florian 113 https://sourceforge.net/projects/acroformtool/ .
7ef7284… drh 114
7ef7284… drh 115 17. Why am I getting this "register_frame_info not found" error on Solaris?
7ef7284… drh 116
7ef7284… drh 117 After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
7ef7284… drh 118 generates an error such as:
7ef7284… drh 119
7ef7284… drh 120 ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
7ef7284… drh 121 symbol __register_frame_info: referenced symbol not found
7ef7284… drh 122
7ef7284… drh 123 The symbol __register_frame_info is not part of zlib, it is generated by
7ef7284… drh 124 the C compiler (cc or gcc). You must recompile applications using zlib
7ef7284… drh 125 which have this problem. This problem is specific to Solaris. See
7ef7284… drh 126 http://www.sunfreeware.com for Solaris versions of zlib and applications
7ef7284… drh 127 using zlib.
7ef7284… drh 128
7ef7284… drh 129 18. Why does gzip give an error on a file I make with compress/deflate?
7ef7284… drh 130
7ef7284… drh 131 The compress and deflate functions produce data in the zlib format, which
7ef7284… drh 132 is different and incompatible with the gzip format. The gz* functions in
7ef7284… drh 133 zlib on the other hand use the gzip format. Both the zlib and gzip formats
7ef7284… drh 134 use the same compressed data format internally, but have different headers
7ef7284… drh 135 and trailers around the compressed data.
7ef7284… drh 136
7ef7284… drh 137 19. Ok, so why are there two different formats?
7ef7284… drh 138
7ef7284… drh 139 The gzip format was designed to retain the directory information about a
7ef7284… drh 140 single file, such as the name and last modification date. The zlib format
7ef7284… drh 141 on the other hand was designed for in-memory and communication channel
7ef7284… drh 142 applications, and has a much more compact header and trailer and uses a
7ef7284… drh 143 faster integrity check than gzip.
7ef7284… drh 144
7ef7284… drh 145 20. Well that's nice, but how do I make a gzip file in memory?
7ef7284… drh 146
7ef7284… drh 147 You can request that deflate write the gzip format instead of the zlib
7ef7284… drh 148 format using deflateInit2(). You can also request that inflate decode the
7ef7284… drh 149 gzip format using inflateInit2(). Read zlib.h for more details.
7ef7284… drh 150
7ef7284… drh 151 21. Is zlib thread-safe?
7ef7284… drh 152
7ef7284… drh 153 Yes. However any library routines that zlib uses and any application-
7ef7284… drh 154 provided memory allocation routines must also be thread-safe. zlib's gz*
7ef7284… drh 155 functions use stdio library routines, and most of zlib's functions use the
7ef7284… drh 156 library memory allocation routines by default. zlib's *Init* functions
7ef7284… drh 157 allow for the application to provide custom memory allocation routines.
6ea30fb… florian 158
6ea30fb… florian 159 If the non-default BUILDFIXED or DYNAMIC_CRC_TABLE defines are used on a
6ea30fb… florian 160 system without atomics (e.g. pre-C11), then inflate() and crc32() will not
6ea30fb… florian 161 be thread safe.
7ef7284… drh 162
7ef7284… drh 163 Of course, you should only operate on any given zlib or gzip stream from a
7ef7284… drh 164 single thread at a time.
7ef7284… drh 165
7ef7284… drh 166 22. Can I use zlib in my commercial application?
7ef7284… drh 167
7ef7284… drh 168 Yes. Please read the license in zlib.h.
7ef7284… drh 169
7ef7284… drh 170 23. Is zlib under the GNU license?
7ef7284… drh 171
7ef7284… drh 172 No. Please read the license in zlib.h.
7ef7284… drh 173
7ef7284… drh 174 24. The license says that altered source versions must be "plainly marked". So
7ef7284… drh 175 what exactly do I need to do to meet that requirement?
7ef7284… drh 176
7ef7284… drh 177 You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
7ef7284… drh 178 particular, the final version number needs to be changed to "f", and an
7ef7284… drh 179 identification string should be appended to ZLIB_VERSION. Version numbers
7ef7284… drh 180 x.x.x.f are reserved for modifications to zlib by others than the zlib
7ef7284… drh 181 maintainers. For example, if the version of the base zlib you are altering
7ef7284… drh 182 is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
7ef7284… drh 183 ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
7ef7284… drh 184 update the version strings in deflate.c and inftrees.c.
7ef7284… drh 185
7ef7284… drh 186 For altered source distributions, you should also note the origin and
7ef7284… drh 187 nature of the changes in zlib.h, as well as in ChangeLog and README, along
7ef7284… drh 188 with the dates of the alterations. The origin should include at least your
7ef7284… drh 189 name (or your company's name), and an email address to contact for help or
7ef7284… drh 190 issues with the library.
7ef7284… drh 191
7ef7284… drh 192 Note that distributing a compiled zlib library along with zlib.h and
7ef7284… drh 193 zconf.h is also a source distribution, and so you should change
7ef7284… drh 194 ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
7ef7284… drh 195 in zlib.h as you would for a full source distribution.
7ef7284… drh 196
7ef7284… drh 197 25. Will zlib work on a big-endian or little-endian architecture, and can I
7ef7284… drh 198 exchange compressed data between them?
7ef7284… drh 199
7ef7284… drh 200 Yes and yes.
7ef7284… drh 201
7ef7284… drh 202 26. Will zlib work on a 64-bit machine?
7ef7284… drh 203
7ef7284… drh 204 Yes. It has been tested on 64-bit machines, and has no dependence on any
7ef7284… drh 205 data types being limited to 32-bits in length. If you have any
7ef7284… drh 206 difficulties, please provide a complete problem report to [email protected]
7ef7284… drh 207
7ef7284… drh 208 27. Will zlib decompress data from the PKWare Data Compression Library?
7ef7284… drh 209
7ef7284… drh 210 No. The PKWare DCL uses a completely different compressed data format than
7ef7284… drh 211 does PKZIP and zlib. However, you can look in zlib's contrib/blast
7ef7284… drh 212 directory for a possible solution to your problem.
7ef7284… drh 213
7ef7284… drh 214 28. Can I access data randomly in a compressed stream?
7ef7284… drh 215
7ef7284… drh 216 No, not without some preparation. If when compressing you periodically use
7ef7284… drh 217 Z_FULL_FLUSH, carefully write all the pending data at those points, and
7ef7284… drh 218 keep an index of those locations, then you can start decompression at those
7ef7284… drh 219 points. You have to be careful to not use Z_FULL_FLUSH too often, since it
7ef7284… drh 220 can significantly degrade compression. Alternatively, you can scan a
7ef7284… drh 221 deflate stream once to generate an index, and then use that index for
7ef7284… drh 222 random access. See examples/zran.c .
7ef7284… drh 223
7ef7284… drh 224 29. Does zlib work on MVS, OS/390, CICS, etc.?
7ef7284… drh 225
7ef7284… drh 226 It has in the past, but we have not heard of any recent evidence. There
7ef7284… drh 227 were working ports of zlib 1.1.4 to MVS, but those links no longer work.
7ef7284… drh 228 If you know of recent, successful applications of zlib on these operating
7ef7284… drh 229 systems, please let us know. Thanks.
7ef7284… drh 230
7ef7284… drh 231 30. Is there some simpler, easier to read version of inflate I can look at to
7ef7284… drh 232 understand the deflate format?
7ef7284… drh 233
7ef7284… drh 234 First off, you should read RFC 1951. Second, yes. Look in zlib's
7ef7284… drh 235 contrib/puff directory.
7ef7284… drh 236
7ef7284… drh 237 31. Does zlib infringe on any patents?
7ef7284… drh 238
7ef7284… drh 239 As far as we know, no. In fact, that was originally the whole point behind
7ef7284… drh 240 zlib. Look here for some more information:
7ef7284… drh 241
6ea30fb… florian 242 https://web.archive.org/web/20180729212847/http://www.gzip.org/#faq11
7ef7284… drh 243
7ef7284… drh 244 32. Can zlib work with greater than 4 GB of data?
7ef7284… drh 245
7ef7284… drh 246 Yes. inflate() and deflate() will process any amount of data correctly.
7ef7284… drh 247 Each call of inflate() or deflate() is limited to input and output chunks
7ef7284… drh 248 of the maximum value that can be stored in the compiler's "unsigned int"
7ef7284… drh 249 type, but there is no limit to the number of chunks. Note however that the
7ef7284… drh 250 strm.total_in and strm_total_out counters may be limited to 4 GB. These
7ef7284… drh 251 counters are provided as a convenience and are not used internally by
7ef7284… drh 252 inflate() or deflate(). The application can easily set up its own counters
7ef7284… drh 253 updated after each call of inflate() or deflate() to count beyond 4 GB.
7ef7284… drh 254 compress() and uncompress() may be limited to 4 GB, since they operate in a
7ef7284… drh 255 single call. gzseek() and gztell() may be limited to 4 GB depending on how
7ef7284… drh 256 zlib is compiled. See the zlibCompileFlags() function in zlib.h.
7ef7284… drh 257
7ef7284… drh 258 The word "may" appears several times above since there is a 4 GB limit only
7ef7284… drh 259 if the compiler's "long" type is 32 bits. If the compiler's "long" type is
7ef7284… drh 260 64 bits, then the limit is 16 exabytes.
7ef7284… drh 261
7ef7284… drh 262 33. Does zlib have any security vulnerabilities?
7ef7284… drh 263
7ef7284… drh 264 The only one that we are aware of is potentially in gzprintf(). If zlib is
6ea30fb… florian 265 compiled to use sprintf() or vsprintf(), which requires that ZLIB_INSECURE
6ea30fb… florian 266 be defined, then there is no protection against a buffer overflow of an 8K
6ea30fb… florian 267 string space (or other value as set by gzbuffer()), other than the caller
6ea30fb… florian 268 of gzprintf() assuring that the output will not exceed 8K. On the other
6ea30fb… florian 269 hand, if zlib is compiled to use snprintf() or vsnprintf(), which should
6ea30fb… florian 270 normally be the case, then there is no vulnerability. The ./configure
6ea30fb… florian 271 script will display warnings if an insecure variation of sprintf() will be
6ea30fb… florian 272 used by gzprintf(). Also the zlibCompileFlags() function will return
6ea30fb… florian 273 information on what variant of sprintf() is used by gzprintf().
7ef7284… drh 274
7ef7284… drh 275 If you don't have snprintf() or vsnprintf() and would like one, you can
6ea30fb… florian 276 find a good portable implementation in stb_sprintf.h here:
7ef7284… drh 277
6ea30fb… florian 278 https://github.com/nothings/stb
7ef7284… drh 279
7ef7284… drh 280 Note that you should be using the most recent version of zlib. Versions
7ef7284… drh 281 1.1.3 and before were subject to a double-free vulnerability, and versions
7ef7284… drh 282 1.2.1 and 1.2.2 were subject to an access exception when decompressing
7ef7284… drh 283 invalid compressed data.
7ef7284… drh 284
7ef7284… drh 285 34. Is there a Java version of zlib?
7ef7284… drh 286
7ef7284… drh 287 Probably what you want is to use zlib in Java. zlib is already included
7ef7284… drh 288 as part of the Java SDK in the java.util.zip package. If you really want
7ef7284… drh 289 a version of zlib written in the Java language, look on the zlib home
6ea30fb… florian 290 page for links: https://zlib.net/ .
7ef7284… drh 291
7ef7284… drh 292 35. I get this or that compiler or source-code scanner warning when I crank it
7ef7284… drh 293 up to maximally-pedantic. Can't you guys write proper code?
7ef7284… drh 294
7ef7284… drh 295 Many years ago, we gave up attempting to avoid warnings on every compiler
7ef7284… drh 296 in the universe. It just got to be a waste of time, and some compilers
7ef7284… drh 297 were downright silly as well as contradicted each other. So now, we simply
7ef7284… drh 298 make sure that the code always works.
7ef7284… drh 299
7ef7284… drh 300 36. Valgrind (or some similar memory access checker) says that deflate is
7ef7284… drh 301 performing a conditional jump that depends on an uninitialized value.
7ef7284… drh 302 Isn't that a bug?
7ef7284… drh 303
7ef7284… drh 304 No. That is intentional for performance reasons, and the output of deflate
7ef7284… drh 305 is not affected. This only started showing up recently since zlib 1.2.x
7ef7284… drh 306 uses malloc() by default for allocations, whereas earlier versions used
7ef7284… drh 307 calloc(), which zeros out the allocated memory. Even though the code was
7ef7284… drh 308 correct, versions 1.2.4 and later was changed to not stimulate these
7ef7284… drh 309 checkers.
7ef7284… drh 310
7ef7284… drh 311 37. Will zlib read the (insert any ancient or arcane format here) compressed
7ef7284… drh 312 data format?
7ef7284… drh 313
7ef7284… drh 314 Probably not. Look in the comp.compression FAQ for pointers to various
7ef7284… drh 315 formats and associated software.
7ef7284… drh 316
7ef7284… drh 317 38. How can I encrypt/decrypt zip files with zlib?
7ef7284… drh 318
7ef7284… drh 319 zlib doesn't support encryption. The original PKZIP encryption is very
7ef7284… drh 320 weak and can be broken with freely available programs. To get strong
6ea30fb… florian 321 encryption, use GnuPG, https://www.gnupg.org/ , which already includes zlib
7ef7284… drh 322 compression. For PKZIP compatible "encryption", look at
6ea30fb… florian 323 https://infozip.sourceforge.net/
7ef7284… drh 324
7ef7284… drh 325 39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
7ef7284… drh 326
7ef7284… drh 327 "gzip" is the gzip format, and "deflate" is the zlib format. They should
7ef7284… drh 328 probably have called the second one "zlib" instead to avoid confusion with
7ef7284… drh 329 the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
7ef7284… drh 330 correctly points to the zlib specification in RFC 1950 for the "deflate"
7ef7284… drh 331 transfer encoding, there have been reports of servers and browsers that
7ef7284… drh 332 incorrectly produce or expect raw deflate data per the deflate
7ef7284… drh 333 specification in RFC 1951, most notably Microsoft. So even though the
7ef7284… drh 334 "deflate" transfer encoding using the zlib format would be the more
7ef7284… drh 335 efficient approach (and in fact exactly what the zlib format was designed
7ef7284… drh 336 for), using the "gzip" transfer encoding is probably more reliable due to
7ef7284… drh 337 an unfortunate choice of name on the part of the HTTP 1.1 authors.
7ef7284… drh 338
7ef7284… drh 339 Bottom line: use the gzip format for HTTP 1.1 encoding.
7ef7284… drh 340
7ef7284… drh 341 40. Does zlib support the new "Deflate64" format introduced by PKWare?
7ef7284… drh 342
7ef7284… drh 343 No. PKWare has apparently decided to keep that format proprietary, since
7ef7284… drh 344 they have not documented it as they have previous compression formats. In
7ef7284… drh 345 any case, the compression improvements are so modest compared to other more
7ef7284… drh 346 modern approaches, that it's not worth the effort to implement.
7ef7284… drh 347
7ef7284… drh 348 41. I'm having a problem with the zip functions in zlib, can you help?
7ef7284… drh 349
7ef7284… drh 350 There are no zip functions in zlib. You are probably using minizip by
7ef7284… drh 351 Giles Vollant, which is found in the contrib directory of zlib. It is not
7ef7284… drh 352 part of zlib. In fact none of the stuff in contrib is part of zlib. The
7ef7284… drh 353 files in there are not supported by the zlib authors. You need to contact
7ef7284… drh 354 the authors of the respective contribution for help.
7ef7284… drh 355
7ef7284… drh 356 42. The match.asm code in contrib is under the GNU General Public License.
7ef7284… drh 357 Since it's part of zlib, doesn't that mean that all of zlib falls under the
7ef7284… drh 358 GNU GPL?
7ef7284… drh 359
7ef7284… drh 360 No. The files in contrib are not part of zlib. They were contributed by
7ef7284… drh 361 other authors and are provided as a convenience to the user within the zlib
7ef7284… drh 362 distribution. Each item in contrib has its own license.
7ef7284… drh 363
7ef7284… drh 364 43. Is zlib subject to export controls? What is its ECCN?
7ef7284… drh 365
7ef7284… drh 366 zlib is not subject to export controls, and so is classified as EAR99.
7ef7284… drh 367
7ef7284… drh 368 44. Can you please sign these lengthy legal documents and fax them back to us
7ef7284… drh 369 so that we can use your software in our product?
7ef7284… drh 370
7ef7284… drh 371 No. Go away. Shoo.

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button