CVE-2018-25032
Description
zlib before 1.2.12 allows memory corruption when deflating (i.e., when compressing) if the input has many distant matches.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Memory corruption in zlib before 1.2.12 when compressing input with many distant matches, potentially leading to arbitrary code execution.
Vulnerability
zlib versions before 1.2.12 contain a memory corruption vulnerability in the deflate function when the input has many distant matches. This occurs during compression and can be triggered by specially crafted data [4].
Exploitation
An attacker can exploit this by providing input that causes many distant matches during compression. No authentication is required if the application compresses attacker-controlled data. The vulnerability is reachable without special privileges.
Impact
Successful exploitation can lead to memory corruption, potentially allowing arbitrary code execution or denial of service. The exact impact depends on how the application uses zlib.
Mitigation
Upgrade to zlib version 1.2.12 or later, which fixes the issue. No workaround is available. Users should update their zlib library and any software that bundles it.
AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
nokogiriRubyGems | < 1.13.4 | 1.13.4 |
Affected products
100- zlib/zlibdescription
- osv-coords99 versionspkg:apk/chainguard/minizippkg:apk/chainguard/zlibpkg:apk/chainguard/zlib-devpkg:apk/chainguard/zlib-docpkg:apk/chainguard/zlib-staticpkg:apk/wolfi/minizippkg:apk/wolfi/zlibpkg:apk/wolfi/zlib-devpkg:apk/wolfi/zlib-docpkg:apk/wolfi/zlib-staticpkg:gem/nokogiripkg:rpm/almalinux/mingw32-zlibpkg:rpm/almalinux/mingw32-zlib-staticpkg:rpm/almalinux/mingw64-zlibpkg:rpm/almalinux/mingw64-zlib-staticpkg:rpm/almalinux/rsyncpkg:rpm/almalinux/rsync-daemonpkg:rpm/almalinux/zlibpkg:rpm/almalinux/zlib-develpkg:rpm/almalinux/zlib-staticpkg:rpm/opensuse/freetype2&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/ghostscript&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/mariadb&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/mupdf&distro=openSUSE%20Leap%2015.4pkg:rpm/opensuse/mupdf&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/perl-Compress-Raw-Zlib&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/python39&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/ruby3.2-rubygem-nokogiri&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/rubygem-nokogiri&distro=openSUSE%20Tumbleweedpkg:rpm/opensuse/zlib&distro=openSUSE%20Leap%2015.3pkg:rpm/suse/lz4&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP5pkg:rpm/suse/lz4&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP5pkg:rpm/suse/lz4&distro=SUSE%20Linux%20Enterprise%20Software%20Development%20Kit%2012%20SP5pkg:rpm/suse/mariadb104&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP1-LTSSpkg:rpm/suse/mariadb104&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP5pkg:rpm/suse/mariadb104&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP1-LTSSpkg:rpm/suse/mariadb104&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP5pkg:rpm/suse/mariadb104&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015%20SP1pkg:rpm/suse/mariadb104&distro=SUSE%20Linux%20Enterprise%20Software%20Development%20Kit%2012%20SP5pkg:rpm/suse/mariadb-connector-c&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP5pkg:rpm/suse/mariadb-connector-c&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP5pkg:rpm/suse/mariadb-connector-c&distro=SUSE%20Linux%20Enterprise%20Software%20Development%20Kit%2012%20SP5pkg:rpm/suse/mariadb&distro=SUSE%20Enterprise%20Storage%207pkg:rpm/suse/mariadb&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP2-ESPOSpkg:rpm/suse/mariadb&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP2-LTSSpkg:rpm/suse/mariadb&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP2-BCLpkg:rpm/suse/mariadb&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP2-LTSSpkg:rpm/suse/mariadb&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015%20SP2pkg:rpm/suse/mariadb&distro=SUSE%20Manager%20Proxy%204.1pkg:rpm/suse/mariadb&distro=SUSE%20Manager%20Retail%20Branch%20Server%204.1pkg:rpm/suse/mariadb&distro=SUSE%20Manager%20Server%204.1pkg:rpm/suse/mupdf&distro=SUSE%20Package%20Hub%2015%20SP4pkg:rpm/suse/python-mysqlclient&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP1-LTSSpkg:rpm/suse/python-mysqlclient&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP5pkg:rpm/suse/python-mysqlclient&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP1-LTSSpkg:rpm/suse/python-mysqlclient&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP5pkg:rpm/suse/python-mysqlclient&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015%20SP1pkg:rpm/suse/python-mysqlclient&distro=SUSE%20Linux%20Enterprise%20Software%20Development%20Kit%2012%20SP5pkg:rpm/suse/zlib&distro=HPE%20Helion%20OpenStack%208pkg:rpm/suse/zlib&distro=SUSE%20Enterprise%20Storage%206pkg:rpm/suse/zlib&distro=SUSE%20Enterprise%20Storage%207pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP1-ESPOSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP1-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP2-ESPOSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015%20SP2-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015-ESPOSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20High%20Performance%20Computing%2015-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Micro%205.0pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Micro%205.1pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Micro%205.2pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Basesystem%2015%20SP3pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Module%20for%20Development%20Tools%2015%20SP3pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Point%20of%20Sale%2011%20SP3pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Real%20Time%2015%20SP2pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2011%20SP4-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP2-BCLpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP3-BCLpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP3-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP4-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2012%20SP5pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP1-BCLpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP1-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP2-BCLpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2015%20SP2-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%2015-LTSSpkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP3pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP4pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2012%20SP5pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015%20SP1pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Server%20for%20SAP%20Applications%2015%20SP2pkg:rpm/suse/zlib&distro=SUSE%20Linux%20Enterprise%20Software%20Development%20Kit%2012%20SP5pkg:rpm/suse/zlib&distro=SUSE%20Manager%20Proxy%204.1pkg:rpm/suse/zlib&distro=SUSE%20Manager%20Retail%20Branch%20Server%204.1pkg:rpm/suse/zlib&distro=SUSE%20Manager%20Server%204.1pkg:rpm/suse/zlib&distro=SUSE%20OpenStack%20Cloud%208pkg:rpm/suse/zlib&distro=SUSE%20OpenStack%20Cloud%209pkg:rpm/suse/zlib&distro=SUSE%20OpenStack%20Cloud%20Crowbar%208pkg:rpm/suse/zlib&distro=SUSE%20OpenStack%20Cloud%20Crowbar%209
< 1.2.13-r1+ 98 more
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.2.13-r1
- (no CPE)range: < 1.13.4
- (no CPE)range: < 1.2.8-10.el8
- (no CPE)range: < 1.2.8-10.el8
- (no CPE)range: < 1.2.8-10.el8
- (no CPE)range: < 1.2.8-10.el8
- (no CPE)range: < 3.1.3-14.el8
- (no CPE)range: < 3.1.3-14.el8
- (no CPE)range: < 1.2.11-18.el8_5
- (no CPE)range: < 1.2.11-18.el8_5
- (no CPE)range: < 1.2.11-18.el8_5
- (no CPE)range: < 2.12.1-1.1
- (no CPE)range: < 10.02.1-1.1
- (no CPE)range: < 10.9.3-1.1
- (no CPE)range: < 1.20.3-bp154.2.3.1
- (no CPE)range: < 1.19.1-1.1
- (no CPE)range: < 2.213-1.1
- (no CPE)range: < 3.9.13-1.1
- (no CPE)range: < 1.13.9-1.7
- (no CPE)range: < 1.13.4-1.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.8.0-3.5.2
- (no CPE)range: < 1.8.0-3.5.2
- (no CPE)range: < 1.8.0-3.5.2
- (no CPE)range: < 10.4.30-150100.3.5.10
- (no CPE)range: < 10.4.30-8.5.46
- (no CPE)range: < 10.4.30-150100.3.5.10
- (no CPE)range: < 10.4.30-8.5.46
- (no CPE)range: < 10.4.30-150100.3.5.10
- (no CPE)range: < 10.4.30-8.5.46
- (no CPE)range: < 3.1.22-2.35.1
- (no CPE)range: < 3.1.22-2.35.1
- (no CPE)range: < 3.1.22-2.35.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 10.4.26-150200.3.31.1
- (no CPE)range: < 1.20.3-bp154.2.3.1
- (no CPE)range: < 1.4.6-150100.3.3.7
- (no CPE)range: < 1.3.14-8.9.2
- (no CPE)range: < 1.4.6-150100.3.3.7
- (no CPE)range: < 1.3.14-8.9.2
- (no CPE)range: < 1.4.6-150100.3.3.7
- (no CPE)range: < 1.3.14-8.9.2
- (no CPE)range: < 1.2.8-12.6.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.7-0.17.3.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.7-0.17.3.1
- (no CPE)range: < 1.2.8-12.6.1
- (no CPE)range: < 1.2.8-12.6.1
- (no CPE)range: < 1.2.8-12.6.1
- (no CPE)range: < 1.2.11-3.6.1
- (no CPE)range: < 1.2.11-11.19.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.8-12.6.1
- (no CPE)range: < 1.2.11-3.6.1
- (no CPE)range: < 1.2.11-11.19.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-11.19.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.11-150000.3.30.1
- (no CPE)range: < 1.2.8-12.6.1
- (no CPE)range: < 1.2.11-3.6.1
- (no CPE)range: < 1.2.8-12.6.1
- (no CPE)range: < 1.2.11-3.6.1
Patches
15c44459c3b28Fix a bug that can crash deflate on some input when using Z_FIXED.
3 files changed · +79 −70
deflate.c+54 −20 modified@@ -255,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, int wrap = 1; static const char my_version[] = ZLIB_VERSION; - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; @@ -329,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + /* We overlay pending_buf and sym_buf. This works since the average size + * for length/distance pairs over any compressed block is assured to be 31 + * bits or less. + * + * Analysis: The longest fixed codes are a length code of 8 bits plus 5 + * extra bits, for lengths 131 to 257. The longest fixed distance codes are + * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest + * possible fixed-codes length/distance pair is then 31 bits total. + * + * sym_buf starts one-fourth of the way into pending_buf. So there are + * three bytes in sym_buf for every four bytes in pending_buf. Each symbol + * in sym_buf is three bytes -- two for the distance and one for the + * literal/length. As each symbol is consumed, the pointer to the next + * sym_buf value to read moves forward three bytes. From that symbol, up to + * 31 bits are written to pending_buf. The closest the written pending_buf + * bits gets to the next sym_buf symbol to read is just before the last + * code is written. At that time, 31*(n-2) bits have been written, just + * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 + * symbols are written.) The closest the writing gets to what is unread is + * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and + * can range from 128 to 32768. + * + * Therefore, at a minimum, there are 142 bits of space between what is + * written and what is read in the overlain buffers, so the symbols cannot + * be overwritten by the compressed data. That space is actually 139 bits, + * due to the three-bit fixed-code block header. + * + * That covers the case where either Z_FIXED is specified, forcing fixed + * codes, or when the use of fixed codes is chosen, because that choice + * results in a smaller compressed block than dynamic codes. That latter + * condition then assures that the above analysis also covers all dynamic + * blocks. A dynamic-code block will only be chosen to be emitted if it has + * fewer bits than a fixed-code block would for the same set of symbols. + * Therefore its average symbol length is assured to be less than 31. So + * the compressed data for a dynamic block also cannot overwrite the + * symbols from which it is being constructed. + */ + + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { @@ -340,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, deflateEnd (strm); return Z_MEM_ERROR; } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + s->sym_buf = s->pending_buf + s->lit_bufsize; + s->sym_end = (s->lit_bufsize - 1) * 3; + /* We avoid equality with lit_bufsize*3 because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ s->level = level; s->strategy = strategy; @@ -552,7 +589,7 @@ int ZEXPORT deflatePrime (strm, bits, value) if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + if (s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; do { put = Buf_size - s->bi_valid; @@ -1113,7 +1150,6 @@ int ZEXPORT deflateCopy (dest, source) #else deflate_state *ds; deflate_state *ss; - ushf *overlay; if (deflateStateCheck(source) || dest == Z_NULL) { @@ -1133,8 +1169,7 @@ int ZEXPORT deflateCopy (dest, source) ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1148,8 +1183,7 @@ int ZEXPORT deflateCopy (dest, source) zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + ds->sym_buf = ds->pending_buf + ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1925,7 +1959,7 @@ local block_state deflate_fast(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2056,7 +2090,7 @@ local block_state deflate_slow(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2131,7 +2165,7 @@ local block_state deflate_rle(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2170,7 +2204,7 @@ local block_state deflate_huff(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; }
deflate.h+11 −14 modified@@ -217,7 +217,7 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ - uchf *l_buf; /* buffer for literals or lengths */ + uchf *sym_buf; /* buffer for distances and literals/lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,13 +239,8 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ + uInt sym_next; /* running index in sym_buf */ + uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ @@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = cc; \ s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (uch)(length); \ ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ + s->sym_buf[s->sym_next++] = dist; \ + s->sym_buf[s->sym_next++] = dist >> 8; \ + s->sym_buf[s->sym_next++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
trees.c+14 −36 modified@@ -416,7 +416,7 @@ local void init_block(s) s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; + s->sym_next = s->matches = 0; } #define SMALLEST 1 @@ -948,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); + s->sym_next / 3)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; @@ -1017,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; + s->sym_buf[s->sym_next++] = dist; + s->sym_buf[s->sym_next++] = dist >> 8; + s->sym_buf[s->sym_next++] = lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1033,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ + return (s->sym_next == s->sym_end); } /* =========================================================================== @@ -1069,13 +1047,14 @@ local void compress_block(s, ltree, dtree) { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ + unsigned sx = 0; /* running index in sym_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; + if (s->sym_next != 0) do { + dist = s->sym_buf[sx++] & 0xff; + dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; + lc = s->sym_buf[sx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); @@ -1100,11 +1079,10 @@ local void compress_block(s, ltree, dtree) } } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); + /* Check that the overlay between pending_buf and sym_buf is ok: */ + Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); - } while (lx < s->last_lit); + } while (sx < s->sym_next); send_code(s, END_BLOCK, ltree); }
Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
41- github.com/advisories/GHSA-jc36-42cf-vqwjghsaADVISORY
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/DCZFIJBJTZ7CL5QXBFKTQ22Q26VINRUF/mitrevendor-advisory
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/DF62MVMH3QUGMBDCB3DY2ERQ6EBHTADB/mitrevendor-advisory
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/JZZPTWRYQULAOL3AW7RZJNVZ2UONXCV4/mitrevendor-advisory
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/NS2D2GFPFGOJUL4WQ3DUAY7HF4VWQ77F/mitrevendor-advisory
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/VOKNP2L734AEL47NRYGVZIKEFOUBQY5Y/mitrevendor-advisory
- lists.fedoraproject.org/archives/list/package-announce%40lists.fedoraproject.org/message/XOKFMSNQ5D5WGMALBNBXU3GE442V74WU/mitrevendor-advisory
- nvd.nist.gov/vuln/detail/CVE-2018-25032ghsaADVISORY
- security.gentoo.org/glsa/202210-42ghsavendor-advisoryWEB
- www.debian.org/security/2022/dsa-5111ghsavendor-advisoryWEB
- seclists.org/fulldisclosure/2022/May/33ghsamailing-listWEB
- seclists.org/fulldisclosure/2022/May/35ghsamailing-listWEB
- seclists.org/fulldisclosure/2022/May/38ghsamailing-listWEB
- www.openwall.com/lists/oss-security/2022/03/25/2ghsamailing-listWEB
- www.openwall.com/lists/oss-security/2022/03/26/1ghsamailing-listWEB
- cert-portal.siemens.com/productcert/pdf/ssa-333517.pdfghsaWEB
- github.com/madler/zlib/commit/5c44459c3b28a9bd3283aaceab7c615f8020c531ghsaWEB
- github.com/madler/zlib/compare/v1.2.11...v1.2.12ghsaWEB
- github.com/madler/zlib/issues/605ghsaWEB
- github.com/rubysec/ruby-advisory-db/blob/master/gems/nokogiri/CVE-2018-25032.ymlghsaWEB
- github.com/sparklemotion/nokogiri/security/advisories/GHSA-v6gp-9mmm-c6p5ghsaWEB
- lists.debian.org/debian-lts-announce/2022/04/msg00000.htmlghsamailing-listWEB
- lists.debian.org/debian-lts-announce/2022/05/msg00008.htmlghsamailing-listWEB
- lists.debian.org/debian-lts-announce/2022/09/msg00023.htmlghsamailing-listWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/DCZFIJBJTZ7CL5QXBFKTQ22Q26VINRUFghsaWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/DF62MVMH3QUGMBDCB3DY2ERQ6EBHTADBghsaWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/JZZPTWRYQULAOL3AW7RZJNVZ2UONXCV4ghsaWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/NS2D2GFPFGOJUL4WQ3DUAY7HF4VWQ77FghsaWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/VOKNP2L734AEL47NRYGVZIKEFOUBQY5YghsaWEB
- lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/XOKFMSNQ5D5WGMALBNBXU3GE442V74WUghsaWEB
- security.netapp.com/advisory/ntap-20220526-0009ghsaWEB
- security.netapp.com/advisory/ntap-20220729-0004ghsaWEB
- support.apple.com/kb/HT213255ghsaWEB
- support.apple.com/kb/HT213256ghsaWEB
- support.apple.com/kb/HT213257ghsaWEB
- www.openwall.com/lists/oss-security/2022/03/24/1ghsaWEB
- www.openwall.com/lists/oss-security/2022/03/28/1ghsaWEB
- www.openwall.com/lists/oss-security/2022/03/28/3ghsaWEB
- www.oracle.com/security-alerts/cpujul2022.htmlghsaWEB
- security.netapp.com/advisory/ntap-20220526-0009/mitre
- security.netapp.com/advisory/ntap-20220729-0004/mitre
News mentions
0No linked articles in our index yet.