142468Speter 2131377Stjr Frequently Asked Questions about zlib 342468Speter 442468Speter 5131377StjrIf your question is not there, please check the zlib home page 6205194Sdelphijhttp://zlib.net/ which may have more recent information. 7205194SdelphijThe lastest zlib FAQ is at http://zlib.net/zlib_faq.html 842468Speter 942468Speter 1092111Sgreen 1. Is zlib Y2K-compliant? 1142468Speter 1292111Sgreen Yes. zlib doesn't handle dates. 1342468Speter 1492111Sgreen 2. Where can I get a Windows DLL version? 1542468Speter 16205194Sdelphij The zlib sources can be compiled without change to produce a DLL. See the 17205194Sdelphij file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the 18205194Sdelphij precompiled DLL are found in the zlib web site at http://zlib.net/ . 1942468Speter 2092111Sgreen 3. Where can I get a Visual Basic interface to zlib? 2142468Speter 2292111Sgreen See 23205194Sdelphij * http://marknelson.us/1997/01/01/zlib-engine/ 24145474Skientzle * win32/DLL_FAQ.txt in the zlib distribution 2542468Speter 26145474Skientzle 4. compress() returns Z_BUF_ERROR. 2742468Speter 28205194Sdelphij Make sure that before the call of compress(), the length of the compressed 29205194Sdelphij buffer is equal to the available size of the compressed buffer and not 30205194Sdelphij zero. For Visual Basic, check that this parameter is passed by reference 3192111Sgreen ("as any"), not by value ("as long"). 3242468Speter 33145474Skientzle 5. deflate() or inflate() returns Z_BUF_ERROR. 3442468Speter 35205194Sdelphij Before making the call, make sure that avail_in and avail_out are not zero. 36205194Sdelphij When setting the parameter flush equal to Z_FINISH, also make sure that 37205194Sdelphij avail_out is big enough to allow processing all pending input. Note that a 38205194Sdelphij Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be 39205194Sdelphij made with more input or output space. A Z_BUF_ERROR may in fact be 40205194Sdelphij unavoidable depending on how the functions are used, since it is not 41205194Sdelphij possible to tell whether or not there is more output pending when 42205194Sdelphij strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a 43205194Sdelphij heavily annotated example. 4442468Speter 4592111Sgreen 6. Where's the zlib documentation (man pages, etc.)? 4642468Speter 47230837Sdelphij It's in zlib.h . Examples of zlib usage are in the files test/example.c 48230837Sdelphij and test/minigzip.c, with more in examples/ . 4942468Speter 5092111Sgreen 7. Why don't you use GNU autoconf or libtool or ...? 5142468Speter 52205194Sdelphij Because we would like to keep zlib as a very small and simple package. 53205194Sdelphij zlib is rather portable and doesn't need much configuration. 5442468Speter 5592111Sgreen 8. I found a bug in zlib. 5642468Speter 57205194Sdelphij Most of the time, such problems are due to an incorrect usage of zlib. 58205194Sdelphij Please try to reproduce the problem with a small program and send the 59205194Sdelphij corresponding source to us at zlib@gzip.org . Do not send multi-megabyte 60205194Sdelphij data files without prior agreement. 6142468Speter 6292111Sgreen 9. Why do I get "undefined reference to gzputc"? 6342468Speter 6492111Sgreen If "make test" produces something like 6542468Speter 6692111Sgreen example.o(.text+0x154): undefined reference to `gzputc' 67131377Stjr 6892111Sgreen check that you don't have old files libz.* in /usr/lib, /usr/local/lib or 6992111Sgreen /usr/X11R6/lib. Remove any old versions, then do "make install". 7042468Speter 7192111Sgreen10. I need a Delphi interface to zlib. 7242468Speter 73131377Stjr See the contrib/delphi directory in the zlib distribution. 7442468Speter 7592111Sgreen11. Can zlib handle .zip archives? 7642468Speter 77145474Skientzle Not by itself, no. See the directory contrib/minizip in the zlib 78145474Skientzle distribution. 7942468Speter 8092111Sgreen12. Can zlib handle .Z files? 8142468Speter 82205194Sdelphij No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt 8392111Sgreen the code of uncompress on your own. 8442468Speter 8592111Sgreen13. How can I make a Unix shared library? 8692111Sgreen 87230837Sdelphij By default a shared (and a static) library is built for Unix. So: 88230837Sdelphij 89230837Sdelphij make distclean 90230837Sdelphij ./configure 9192111Sgreen make 9292111Sgreen 93131377Stjr14. How do I install a shared zlib library on Unix? 9492111Sgreen 95145474Skientzle After the above, then: 96145474Skientzle 97131377Stjr make install 9892111Sgreen 99131377Stjr However, many flavors of Unix come with a shared zlib already installed. 100131377Stjr Before going to the trouble of compiling a shared version of zlib and 101205194Sdelphij trying to install it, you may want to check if it's already there! If you 102205194Sdelphij can #include <zlib.h>, it's there. The -lz option will probably link to 103205194Sdelphij it. You can check the version at the top of zlib.h or with the 104205194Sdelphij ZLIB_VERSION symbol defined in zlib.h . 105131377Stjr 106145474Skientzle15. I have a question about OttoPDF. 10792111Sgreen 10892111Sgreen We are not the authors of OttoPDF. The real author is on the OttoPDF web 109145474Skientzle site: Joel Hainley, jhainley@myndkryme.com. 110131377Stjr 111145474Skientzle16. Can zlib decode Flate data in an Adobe PDF file? 112131377Stjr 113205194Sdelphij Yes. See http://www.pdflib.com/ . To modify PDF forms, see 114205194Sdelphij http://sourceforge.net/projects/acroformtool/ . 115145474Skientzle 116145474Skientzle17. Why am I getting this "register_frame_info not found" error on Solaris? 117145474Skientzle 118145474Skientzle After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib 119145474Skientzle generates an error such as: 120145474Skientzle 121145474Skientzle ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: 122145474Skientzle symbol __register_frame_info: referenced symbol not found 123145474Skientzle 124145474Skientzle The symbol __register_frame_info is not part of zlib, it is generated by 125205194Sdelphij the C compiler (cc or gcc). You must recompile applications using zlib 126205194Sdelphij which have this problem. This problem is specific to Solaris. See 127145474Skientzle http://www.sunfreeware.com for Solaris versions of zlib and applications 128145474Skientzle using zlib. 129145474Skientzle 130145474Skientzle18. Why does gzip give an error on a file I make with compress/deflate? 131145474Skientzle 132131377Stjr The compress and deflate functions produce data in the zlib format, which 133205194Sdelphij is different and incompatible with the gzip format. The gz* functions in 134205194Sdelphij zlib on the other hand use the gzip format. Both the zlib and gzip formats 135205194Sdelphij use the same compressed data format internally, but have different headers 136205194Sdelphij and trailers around the compressed data. 137131377Stjr 138145474Skientzle19. Ok, so why are there two different formats? 139131377Stjr 140205194Sdelphij The gzip format was designed to retain the directory information about a 141205194Sdelphij single file, such as the name and last modification date. The zlib format 142205194Sdelphij on the other hand was designed for in-memory and communication channel 143205194Sdelphij applications, and has a much more compact header and trailer and uses a 144205194Sdelphij faster integrity check than gzip. 145131377Stjr 146145474Skientzle20. Well that's nice, but how do I make a gzip file in memory? 147131377Stjr 148131377Stjr You can request that deflate write the gzip format instead of the zlib 149205194Sdelphij format using deflateInit2(). You can also request that inflate decode the 150205194Sdelphij gzip format using inflateInit2(). Read zlib.h for more details. 151131377Stjr 152145474Skientzle21. Is zlib thread-safe? 153131377Stjr 154205194Sdelphij Yes. However any library routines that zlib uses and any application- 155205194Sdelphij provided memory allocation routines must also be thread-safe. zlib's gz* 156131377Stjr functions use stdio library routines, and most of zlib's functions use the 157205194Sdelphij library memory allocation routines by default. zlib's *Init* functions 158205194Sdelphij allow for the application to provide custom memory allocation routines. 159131377Stjr 160131377Stjr Of course, you should only operate on any given zlib or gzip stream from a 161131377Stjr single thread at a time. 162131377Stjr 163145474Skientzle22. Can I use zlib in my commercial application? 164131377Stjr 165205194Sdelphij Yes. Please read the license in zlib.h. 166131377Stjr 167145474Skientzle23. Is zlib under the GNU license? 168131377Stjr 169205194Sdelphij No. Please read the license in zlib.h. 170131377Stjr 171145474Skientzle24. The license says that altered source versions must be "plainly marked". So 172131377Stjr what exactly do I need to do to meet that requirement? 173131377Stjr 174205194Sdelphij You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In 175131377Stjr particular, the final version number needs to be changed to "f", and an 176205194Sdelphij identification string should be appended to ZLIB_VERSION. Version numbers 177131377Stjr x.x.x.f are reserved for modifications to zlib by others than the zlib 178205194Sdelphij maintainers. For example, if the version of the base zlib you are altering 179131377Stjr is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and 180205194Sdelphij ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also 181131377Stjr update the version strings in deflate.c and inftrees.c. 182131377Stjr 183131377Stjr For altered source distributions, you should also note the origin and 184131377Stjr nature of the changes in zlib.h, as well as in ChangeLog and README, along 185205194Sdelphij with the dates of the alterations. The origin should include at least your 186131377Stjr name (or your company's name), and an email address to contact for help or 187131377Stjr issues with the library. 188131377Stjr 189131377Stjr Note that distributing a compiled zlib library along with zlib.h and 190131377Stjr zconf.h is also a source distribution, and so you should change 191131377Stjr ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes 192131377Stjr in zlib.h as you would for a full source distribution. 193131377Stjr 194145474Skientzle25. Will zlib work on a big-endian or little-endian architecture, and can I 195131377Stjr exchange compressed data between them? 196131377Stjr 197131377Stjr Yes and yes. 198131377Stjr 199145474Skientzle26. Will zlib work on a 64-bit machine? 200131377Stjr 201205194Sdelphij Yes. It has been tested on 64-bit machines, and has no dependence on any 202205194Sdelphij data types being limited to 32-bits in length. If you have any 203131377Stjr difficulties, please provide a complete problem report to zlib@gzip.org 204131377Stjr 205145474Skientzle27. Will zlib decompress data from the PKWare Data Compression Library? 206131377Stjr 207205194Sdelphij No. The PKWare DCL uses a completely different compressed data format than 208205194Sdelphij does PKZIP and zlib. However, you can look in zlib's contrib/blast 209131377Stjr directory for a possible solution to your problem. 210131377Stjr 211145474Skientzle28. Can I access data randomly in a compressed stream? 212131377Stjr 213205194Sdelphij No, not without some preparation. If when compressing you periodically use 214205194Sdelphij Z_FULL_FLUSH, carefully write all the pending data at those points, and 215205194Sdelphij keep an index of those locations, then you can start decompression at those 216205194Sdelphij points. You have to be careful to not use Z_FULL_FLUSH too often, since it 217205194Sdelphij can significantly degrade compression. Alternatively, you can scan a 218205194Sdelphij deflate stream once to generate an index, and then use that index for 219205194Sdelphij random access. See examples/zran.c . 220131377Stjr 221145474Skientzle29. Does zlib work on MVS, OS/390, CICS, etc.? 222131377Stjr 223205194Sdelphij It has in the past, but we have not heard of any recent evidence. There 224205194Sdelphij were working ports of zlib 1.1.4 to MVS, but those links no longer work. 225205194Sdelphij If you know of recent, successful applications of zlib on these operating 226205194Sdelphij systems, please let us know. Thanks. 227131377Stjr 228205194Sdelphij30. Is there some simpler, easier to read version of inflate I can look at to 229205194Sdelphij understand the deflate format? 230131377Stjr 231205194Sdelphij First off, you should read RFC 1951. Second, yes. Look in zlib's 232131377Stjr contrib/puff directory. 233131377Stjr 234145474Skientzle31. Does zlib infringe on any patents? 235131377Stjr 236205194Sdelphij As far as we know, no. In fact, that was originally the whole point behind 237205194Sdelphij zlib. Look here for some more information: 238131377Stjr 239131377Stjr http://www.gzip.org/#faq11 240131377Stjr 241145474Skientzle32. Can zlib work with greater than 4 GB of data? 242131377Stjr 243205194Sdelphij Yes. inflate() and deflate() will process any amount of data correctly. 244131377Stjr Each call of inflate() or deflate() is limited to input and output chunks 245131377Stjr of the maximum value that can be stored in the compiler's "unsigned int" 246205194Sdelphij type, but there is no limit to the number of chunks. Note however that the 247205194Sdelphij strm.total_in and strm_total_out counters may be limited to 4 GB. These 248131377Stjr counters are provided as a convenience and are not used internally by 249205194Sdelphij inflate() or deflate(). The application can easily set up its own counters 250131377Stjr updated after each call of inflate() or deflate() to count beyond 4 GB. 251131377Stjr compress() and uncompress() may be limited to 4 GB, since they operate in a 252205194Sdelphij single call. gzseek() and gztell() may be limited to 4 GB depending on how 253205194Sdelphij zlib is compiled. See the zlibCompileFlags() function in zlib.h. 254131377Stjr 255205194Sdelphij The word "may" appears several times above since there is a 4 GB limit only 256205194Sdelphij if the compiler's "long" type is 32 bits. If the compiler's "long" type is 257205194Sdelphij 64 bits, then the limit is 16 exabytes. 258131377Stjr 259145474Skientzle33. Does zlib have any security vulnerabilities? 260131377Stjr 261205194Sdelphij The only one that we are aware of is potentially in gzprintf(). If zlib is 262205194Sdelphij compiled to use sprintf() or vsprintf(), then there is no protection 263205194Sdelphij against a buffer overflow of an 8K string space (or other value as set by 264205194Sdelphij gzbuffer()), other than the caller of gzprintf() assuring that the output 265205194Sdelphij will not exceed 8K. On the other hand, if zlib is compiled to use 266205194Sdelphij snprintf() or vsnprintf(), which should normally be the case, then there is 267205194Sdelphij no vulnerability. The ./configure script will display warnings if an 268205194Sdelphij insecure variation of sprintf() will be used by gzprintf(). Also the 269205194Sdelphij zlibCompileFlags() function will return information on what variant of 270205194Sdelphij sprintf() is used by gzprintf(). 271131377Stjr 272131377Stjr If you don't have snprintf() or vsnprintf() and would like one, you can 273131377Stjr find a portable implementation here: 274131377Stjr 275131377Stjr http://www.ijs.si/software/snprintf/ 276131377Stjr 277205194Sdelphij Note that you should be using the most recent version of zlib. Versions 278205194Sdelphij 1.1.3 and before were subject to a double-free vulnerability, and versions 279205194Sdelphij 1.2.1 and 1.2.2 were subject to an access exception when decompressing 280205194Sdelphij invalid compressed data. 281131377Stjr 282145474Skientzle34. Is there a Java version of zlib? 283131377Stjr 284131377Stjr Probably what you want is to use zlib in Java. zlib is already included 285131377Stjr as part of the Java SDK in the java.util.zip package. If you really want 286131377Stjr a version of zlib written in the Java language, look on the zlib home 287205194Sdelphij page for links: http://zlib.net/ . 288131377Stjr 289145474Skientzle35. I get this or that compiler or source-code scanner warning when I crank it 290145474Skientzle up to maximally-pedantic. Can't you guys write proper code? 291131377Stjr 292131377Stjr Many years ago, we gave up attempting to avoid warnings on every compiler 293205194Sdelphij in the universe. It just got to be a waste of time, and some compilers 294205194Sdelphij were downright silly as well as contradicted each other. So now, we simply 295205194Sdelphij make sure that the code always works. 296131377Stjr 297157043Sdes36. Valgrind (or some similar memory access checker) says that deflate is 298157043Sdes performing a conditional jump that depends on an uninitialized value. 299157043Sdes Isn't that a bug? 300157043Sdes 301205194Sdelphij No. That is intentional for performance reasons, and the output of deflate 302205194Sdelphij is not affected. This only started showing up recently since zlib 1.2.x 303205194Sdelphij uses malloc() by default for allocations, whereas earlier versions used 304205194Sdelphij calloc(), which zeros out the allocated memory. Even though the code was 305205194Sdelphij correct, versions 1.2.4 and later was changed to not stimulate these 306205194Sdelphij checkers. 307157043Sdes 308157043Sdes37. Will zlib read the (insert any ancient or arcane format here) compressed 309131377Stjr data format? 310131377Stjr 311131377Stjr Probably not. Look in the comp.compression FAQ for pointers to various 312131377Stjr formats and associated software. 313131377Stjr 314157043Sdes38. How can I encrypt/decrypt zip files with zlib? 315131377Stjr 316205194Sdelphij zlib doesn't support encryption. The original PKZIP encryption is very 317205194Sdelphij weak and can be broken with freely available programs. To get strong 318205194Sdelphij encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib 319205194Sdelphij compression. For PKZIP compatible "encryption", look at 320205194Sdelphij http://www.info-zip.org/ 321131377Stjr 322157043Sdes39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? 323131377Stjr 324205194Sdelphij "gzip" is the gzip format, and "deflate" is the zlib format. They should 325205194Sdelphij probably have called the second one "zlib" instead to avoid confusion with 326205194Sdelphij the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 327131377Stjr correctly points to the zlib specification in RFC 1950 for the "deflate" 328131377Stjr transfer encoding, there have been reports of servers and browsers that 329131377Stjr incorrectly produce or expect raw deflate data per the deflate 330230837Sdelphij specification in RFC 1951, most notably Microsoft. So even though the 331131377Stjr "deflate" transfer encoding using the zlib format would be the more 332131377Stjr efficient approach (and in fact exactly what the zlib format was designed 333131377Stjr for), using the "gzip" transfer encoding is probably more reliable due to 334131377Stjr an unfortunate choice of name on the part of the HTTP 1.1 authors. 335131377Stjr 336131377Stjr Bottom line: use the gzip format for HTTP 1.1 encoding. 337131377Stjr 338157043Sdes40. Does zlib support the new "Deflate64" format introduced by PKWare? 339131377Stjr 340205194Sdelphij No. PKWare has apparently decided to keep that format proprietary, since 341205194Sdelphij they have not documented it as they have previous compression formats. In 342205194Sdelphij any case, the compression improvements are so modest compared to other more 343205194Sdelphij modern approaches, that it's not worth the effort to implement. 344131377Stjr 345205194Sdelphij41. I'm having a problem with the zip functions in zlib, can you help? 346205194Sdelphij 347205194Sdelphij There are no zip functions in zlib. You are probably using minizip by 348205194Sdelphij Giles Vollant, which is found in the contrib directory of zlib. It is not 349205194Sdelphij part of zlib. In fact none of the stuff in contrib is part of zlib. The 350205194Sdelphij files in there are not supported by the zlib authors. You need to contact 351205194Sdelphij the authors of the respective contribution for help. 352205194Sdelphij 353205194Sdelphij42. The match.asm code in contrib is under the GNU General Public License. 354205194Sdelphij Since it's part of zlib, doesn't that mean that all of zlib falls under the 355205194Sdelphij GNU GPL? 356205194Sdelphij 357205194Sdelphij No. The files in contrib are not part of zlib. They were contributed by 358205194Sdelphij other authors and are provided as a convenience to the user within the zlib 359205194Sdelphij distribution. Each item in contrib has its own license. 360205194Sdelphij 361205194Sdelphij43. Is zlib subject to export controls? What is its ECCN? 362205194Sdelphij 363205194Sdelphij zlib is not subject to export controls, and so is classified as EAR99. 364205194Sdelphij 365205194Sdelphij44. Can you please sign these lengthy legal documents and fax them back to us 366131377Stjr so that we can use your software in our product? 367131377Stjr 368131377Stjr No. Go away. Shoo. 369