
                Frequently Asked Questions about zlib


If your question is not there, please check the zlib home page 
http://www.zlib.org which may have more recent information.
The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html


 1. Is zlib Y2K-compliant?

    Yes. zlib doesn't handle dates.

 2. Where can I get a Windows DLL version?

    The zlib sources can be compiled without change to produce a DLL. If you
    want a precompiled DLL, see http://www.winimage.com/zLibDll/ . Questions
    about the zlib DLL should be sent to Gilles Vollant (info@winimage.com).

 3. Where can I get a Visual Basic interface to zlib?

    See
        * http://www.winimage.com/zLibDll/cmp-z-it.zip
        * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm
        * contrib/visual-basic.txt in the zlib distribution

 4. compress() returns Z_BUF_ERROR

    Make sure that before the call of compress, the length of the compressed
    buffer is equal to the total size of the compressed buffer and not
    zero. For Visual Basic, check that this parameter is passed by reference
    ("as any"), not by value ("as long").

 5. deflate() or inflate() returns Z_BUF_ERROR

    Before making the call, make sure that avail_in and avail_out are not
    zero. When setting the parameter flush equal to Z_FINISH, also make sure
    that avail_out is big enough to allow processing all pending input.
    Note that a Z_BUF_ERROR is not fatal--another call to deflate() or
    inflate() can be made with more input or output space. A Z_BUF_ERROR
    may in fact be unavoidable depending on how the functions are used, since
    it is not possible to tell whether or not there is more output pending
    when strm.avail_out returns with zero.

 6. Where's the zlib documentation (man pages, etc.)?

    It's in zlib.h for the moment, and Francis S. Lin has converted it to a
    web page zlib.html. Volunteers to transform this to Unix-style man pages,
    please contact Jean-loup Gailly (jloup@gzip.org). Examples of zlib usage
    are in the files example.c and minigzip.c.

 7. Why don't you use GNU autoconf or libtool or ...?

    Because we would like to keep zlib as a very small and simple
    package. zlib is rather portable and doesn't need much configuration.

 8. I found a bug in zlib.

    Most of the time, such problems are due to an incorrect usage of
    zlib. Please try to reproduce the problem with a small program and send
    the corresponding source to us at zlib@gzip.org . Do not send
    multi-megabyte data files without prior agreement.

 9. Why do I get "undefined reference to gzputc"?

    If "make test" produces something like

       example.o(.text+0x154): undefined reference to `gzputc'
      
    check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
    /usr/X11R6/lib. Remove any old versions, then do "make install".

10. I need a Delphi interface to zlib.

    See the directories contrib/delphi and contrib/delphi2 in the zlib
    distribution.

11. Can zlib handle .zip archives?

    See the directory contrib/minizip in the zlib distribution.

12. Can zlib handle .Z files?

    No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
    the code of uncompress on your own.

13. How can I make a Unix shared library?

    make clean
    ./configure -s
    make

14. How do I install a shared zlib library on Unix?

    make install

    However, many flavors of Unix come with a shared zlib already installed.
    Before going to the trouble of compiling a shared version of zlib and
    trying to install it, you may want to check if it's already there! If you
    can #include <zlib.h>, it's there. The -lz option will probably link to it.

15. I have a question about OttoPDF

    We are not the authors of OttoPDF. The real author is on the OttoPDF web
    site Joel Hainley jhainley@myndkryme.com.

16. Why does gzip give an error on a file I make with compress/deflate?

    The compress and deflate functions produce data in the zlib format, which
    is different and incompatible with the gzip format. The gz* functions in
    zlib on the other hand use the gzip format. Both the zlib and gzip
    formats use the same compressed data format internally, but have different
    headers and trailers around the compressed data.

17. Ok, so why are there two different formats?

    The gzip format was designed to retain the directory information about
    a single file, such as the name and last modification date. The zlib
    format on the other hand was designed for in-memory and communication
    channel applications, and has a much more compact header and trailer and
    uses a faster integrity check than gzip.

18. Well that's nice, but how do I make a gzip file in memory?

    Read RFC 1952 for the gzip header and trailer format, and roll your own
    gzip formatted data using raw deflate and crc32().

19. Is zlib thread-safe?

    Yes. However any library routines that zlib uses and any application-
    provided memory allocation routines must also be thread-safe. zlib's gz*
    functions use stdio library routines, and most of zlib's functions use the
    library memory allocation routines by default. zlib's Init functions allow
    for the application to provide custom memory allocation routines.

    Of course, you should only operate on any given zlib or gzip stream from a
    single thread at a time.

20. Can I use zlib in my commercial application?

    Yes. Please read the license in zlib.h.

21. Is zlib under the GNU license?

    No. Please read the license in zlib.h.

22. The license says that altered source versions must be "plainly marked". So
    what exactly do I need to do to meet that requirement?

    You need to append something the ZLIB_VERSION string in zlib.h. For
    example, if the version of the base zlib you are altering is "1.2.3", then
    you could change the string to "1.2.3-fred-mods-v3". You should not change
    it to "1.2.4" or "1.2.3.1" since the zlib authors would like to reserve
    those forms of the version for their own use.

    For altered source distributions, you should also note the origin and
    nature of the changes in zlib.h, as well as in ChangeLog and README, along
    with the dates of the alterations. The origin should include at least your
    name (or your company's name), and an email address to contact for help or
    issues with the library.

    Note that distributing a compiled zlib library along with zlib.h and
    zconf.h is also a source distribution, and so you should change
    ZLIB_VERSION and note the origin and nature of the changes in zlib.h as you
    would for a full source distribution.

23. Will zlib work on a big-endian or little-endian architecture, and can I
    exchange compressed data between them?

    Yes and yes.

24. Will zlib work on a 64-bit machine?

    It should. It has been tested on 64-bit machines, and has no dependence
    on any data types being limited to 32-bits in length. If you have any
    difficulties, please provide a complete problem report to zlib@gzip.org

25. Will zlib decompress data from the PKWare Data Compression Library?

    No. The PKWare DCL uses a completely different compressed data format
    than does PKZIP and zlib. However, you can look in zlib's contrib/blast
    directory for a possible solution to your problem.

26. Can I access data randomly in a compressed stream?

    No, not without some preparation. If when compressing you periodically
    use Z_FULL_FLUSH, carefully write all the pending data at those points,
    and keep an index of those locations, then you can start decompression
    at those points. You have to be careful to not use Z_FULL_FLUSH too
    often, since it can significantly degrade compression.

27. Does zlib work on MVS, OS/390, CICS, etc.?

    We don't know for sure. We have heard occasional reports of success on
    these systems. If you do use it on one of these, please provide us with
    a report, instructions, and patches that we can reference when we get
    these questions. Thanks.

28. Is there some simpler, easier to read version of inflate I can look at
    to understand the deflate format?

    First off, you should read RFC 1951. Second, yes. Look in zlib's
    contrib/puff directory.

29. Does zlib infringe on any patents?

    As far as we know, no. In fact, that was originally the whole point behind
    zlib. Look here for some more information:

    http://www.gzip.org/#faq11

30. Can zlib work with greater than 4 GB of data?

    Yes. inflate() and deflate() will process any amount of data correctly.
    However the strm.total_in and strm_total_out counters may be limited to
    4 GB. The application can easily set up its own counters updated after each
    call of inflate() or deflate() to count beyond 4 GB. compress() and
    uncompress() may be limited to 4 GB, since they operate in a single call
    using unsigned long lengths. gzseek() and gztell() may be limited to 4 GB
    depending on how zlib is compiled.

31. Does zlib have any security vulnerabilities?

    The only one that we are aware of is potentially in gzprintf(). If zlib
    is compiled to use sprintf() or vsprintf(), then there is no protection
    against a buffer overflow of a 4K string space, other than the caller of
    gzprintf() assuring that the output will not exceed 4K. On the other
    hand, if zlib is compiled to use snprintf() or vsnprintf(), which should
    normally be the case, then there is no vulnerability. The ./configure
    script will display warnings if an insecure variation of sprintf() will
    be used by gzprintf(). Also the zlibCompileFlags() functions will return
    information on what variant of sprintf() is used by gzprintf().

    If you don't have snprintf() or vsnprintf() and would like one, you can
    find a portable implementation here:

        http://www.ijs.si/software/snprintf/

    Note that you should be using the most recent version of zlib. Versions
    1.1.3 and before were subject to a double-free vulnerability.

32. Is there a Java version of zlib?

    Probably what you want is to use zlib in Java. zlib is already included
    as part of the Java SDK in the java.util.zip class. If you really want
    a version of zlib written in the Java language, look on the zlib home
    page for links: http://www.zlib.org/

33. I get this or that compiler or source-code scanner warning when I crank it
    up to maximally-pendantic. Can't you guys write proper code?

    Many years ago, we gave up attempting to avoid warnings on every compiler
    in the universe. It just got to be a waste of time, and some compilers
    were downright silly. So now, we simply make sure that the code always
    works.

34. Will zlib read the (insert any ancient or arcane format here) compressed
    data format?

    Probably not. Look in the comp.compression FAQ for pointers to various
    formats and associated software.

35. How can I encrypt/decrypt zip files with zlib?

    zlib doesn't support encryption. PKZIP encryption is very weak and can be
    broken with freely available programs. To get strong encryption, use gpg
    which already includes zlib compression.

36. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?

    "gzip" is the gzip format, and "deflate" is the zlib format. They should
    probably have called the second one "zlib" instead to avoid confusion
    with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
    correctly points to the zlib specification in RFC 1950 for the "deflate"
    transfer encoding, there have been reports of servers and browsers that
    incorrectly produce or expect raw deflate data per the deflate
    specficiation in RFC 1951, most notably Microsoft. So even though the
    "deflate" transfer encoding using the zlib format would be the more
    efficient approach (and in fact exactly what the zlib format was designed
    for), using the "gzip" transfer encoding is probably more reliable due to
    an unfortunate choice of name on the part of the HTTP 1.1 authors.

37. Does zlib support the new "Deflate64" format introduced by PKWare?

    No. PKWare has apparently decided to keep that format proprietary, since
    they have not documented it as they have previous compression formats.
    In any case, the compression improvements are so modest compared to other
    more modern approaches, that it's not worth the effort to implement.

38. Can you please sign these lengthy legal documents and fax them back to us
    so that we can use your software in our product?

    No. Go away.
