Blame SOURCES/rsync-3.1.3-cve-2018-25032.patch

86a62d
From 5c44459c3b28a9bd3283aaceab7c615f8020c531 Mon Sep 17 00:00:00 2001
86a62d
From: Mark Adler <madler@alumni.caltech.edu>
86a62d
Date: Tue, 17 Apr 2018 22:09:22 -0700
86a62d
Subject: [PATCH] Fix a bug that can crash deflate on some input when using
86a62d
 Z_FIXED.
86a62d
86a62d
This bug was reported by Danilo Ramos of Eideticom, Inc. It has
86a62d
lain in wait 13 years before being found! The bug was introduced
86a62d
in zlib 1.2.2.2, with the addition of the Z_FIXED option. That
86a62d
option forces the use of fixed Huffman codes. For rare inputs with
86a62d
a large number of distant matches, the pending buffer into which
86a62d
the compressed data is written can overwrite the distance symbol
86a62d
table which it overlays. That results in corrupted output due to
86a62d
invalid distances, and can result in out-of-bound accesses,
86a62d
crashing the application.
86a62d
86a62d
The fix here combines the distance buffer and literal/length
86a62d
buffers into a single symbol buffer. Now three bytes of pending
86a62d
buffer space are opened up for each literal or length/distance
86a62d
pair consumed, instead of the previous two bytes. This assures
86a62d
that the pending buffer cannot overwrite the symbol table, since
86a62d
the maximum fixed code compressed length/distance is 31 bits, and
86a62d
since there are four bytes of pending space for every three bytes
86a62d
of symbol space.
86a62d
---
86a62d
 deflate.c | 74 ++++++++++++++++++++++++++++++++++++++++---------------
86a62d
 deflate.h | 25 +++++++++----------
86a62d
 trees.c   | 50 +++++++++++--------------------------
86a62d
 3 files changed, 79 insertions(+), 70 deletions(-)
86a62d
86a62d
diff --git a/zlib/deflate.c b/zlib/deflate.c
86a62d
index 425babc00..19cba873a 100644
86a62d
--- a/zlib/deflate.c
86a62d
+++ b/zlib/deflate.c
86a62d
@@ -255,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
86a62d
     int wrap = 1;
86a62d
     static const char my_version[] = ZLIB_VERSION;
86a62d
 
86a62d
-    ushf *overlay;
86a62d
-    /* We overlay pending_buf and d_buf+l_buf. This works since the average
86a62d
-     * output size for (length,distance) codes is <= 24 bits.
86a62d
-     */
86a62d
-
86a62d
     if (version == Z_NULL || version[0] != my_version[0] ||
86a62d
         stream_size != sizeof(z_stream)) {
86a62d
         return Z_VERSION_ERROR;
86a62d
@@ -329,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
86a62d
 
86a62d
     s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
86a62d
 
86a62d
-    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
86a62d
-    s->pending_buf = (uchf *) overlay;
86a62d
-    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
86a62d
+    /* We overlay pending_buf and sym_buf. This works since the average size
86a62d
+     * for length/distance pairs over any compressed block is assured to be 31
86a62d
+     * bits or less.
86a62d
+     *
86a62d
+     * Analysis: The longest fixed codes are a length code of 8 bits plus 5
86a62d
+     * extra bits, for lengths 131 to 257. The longest fixed distance codes are
86a62d
+     * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest
86a62d
+     * possible fixed-codes length/distance pair is then 31 bits total.
86a62d
+     *
86a62d
+     * sym_buf starts one-fourth of the way into pending_buf. So there are
86a62d
+     * three bytes in sym_buf for every four bytes in pending_buf. Each symbol
86a62d
+     * in sym_buf is three bytes -- two for the distance and one for the
86a62d
+     * literal/length. As each symbol is consumed, the pointer to the next
86a62d
+     * sym_buf value to read moves forward three bytes. From that symbol, up to
86a62d
+     * 31 bits are written to pending_buf. The closest the written pending_buf
86a62d
+     * bits gets to the next sym_buf symbol to read is just before the last
86a62d
+     * code is written. At that time, 31*(n-2) bits have been written, just
86a62d
+     * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
86a62d
+     * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
86a62d
+     * symbols are written.) The closest the writing gets to what is unread is
86a62d
+     * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
86a62d
+     * can range from 128 to 32768.
86a62d
+     *
86a62d
+     * Therefore, at a minimum, there are 142 bits of space between what is
86a62d
+     * written and what is read in the overlain buffers, so the symbols cannot
86a62d
+     * be overwritten by the compressed data. That space is actually 139 bits,
86a62d
+     * due to the three-bit fixed-code block header.
86a62d
+     *
86a62d
+     * That covers the case where either Z_FIXED is specified, forcing fixed
86a62d
+     * codes, or when the use of fixed codes is chosen, because that choice
86a62d
+     * results in a smaller compressed block than dynamic codes. That latter
86a62d
+     * condition then assures that the above analysis also covers all dynamic
86a62d
+     * blocks. A dynamic-code block will only be chosen to be emitted if it has
86a62d
+     * fewer bits than a fixed-code block would for the same set of symbols.
86a62d
+     * Therefore its average symbol length is assured to be less than 31. So
86a62d
+     * the compressed data for a dynamic block also cannot overwrite the
86a62d
+     * symbols from which it is being constructed.
86a62d
+     */
86a62d
+
86a62d
+    s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4);
86a62d
+    s->pending_buf_size = (ulg)s->lit_bufsize * 4;
86a62d
 
86a62d
     if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
86a62d
         s->pending_buf == Z_NULL) {
86a62d
@@ -340,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
86a62d
         deflateEnd (strm);
86a62d
         return Z_MEM_ERROR;
86a62d
     }
86a62d
-    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
86a62d
-    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
86a62d
+    s->sym_buf = s->pending_buf + s->lit_bufsize;
86a62d
+    s->sym_end = (s->lit_bufsize - 1) * 3;
86a62d
+    /* We avoid equality with lit_bufsize*3 because of wraparound at 64K
86a62d
+     * on 16 bit machines and because stored blocks are restricted to
86a62d
+     * 64K-1 bytes.
86a62d
+     */
86a62d
 
86a62d
     s->level = level;
86a62d
     s->strategy = strategy;
86a62d
@@ -552,7 +589,7 @@ int ZEXPORT deflatePrime (strm, bits, value)
86a62d
 
86a62d
     if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
86a62d
     s = strm->state;
86a62d
-    if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
86a62d
+    if (s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
86a62d
         return Z_BUF_ERROR;
86a62d
     do {
86a62d
         put = Buf_size - s->bi_valid;
86a62d
@@ -1113,7 +1150,6 @@ int ZEXPORT deflateCopy (dest, source)
86a62d
 #else
86a62d
     deflate_state *ds;
86a62d
     deflate_state *ss;
86a62d
-    ushf *overlay;
86a62d
 
86a62d
 
86a62d
     if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
86a62d
@@ -1133,8 +1169,7 @@ int ZEXPORT deflateCopy (dest, source)
86a62d
     ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
86a62d
     ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));
86a62d
     ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));
86a62d
-    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
86a62d
-    ds->pending_buf = (uchf *) overlay;
86a62d
+    ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4);
86a62d
 
86a62d
     if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
86a62d
         ds->pending_buf == Z_NULL) {
86a62d
@@ -1148,8 +1183,7 @@ int ZEXPORT deflateCopy (dest, source)
86a62d
     zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
86a62d
 
86a62d
     ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
86a62d
-    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
86a62d
-    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
86a62d
+    ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
86a62d
 
86a62d
     ds->l_desc.dyn_tree = ds->dyn_ltree;
86a62d
     ds->d_desc.dyn_tree = ds->dyn_dtree;
86a62d
@@ -1771,7 +1771,7 @@ local block_state deflate_fast(s, flush)
86a62d
         FLUSH_BLOCK(s, 1);
86a62d
         return finish_done;
86a62d
     }
86a62d
-    if (s->last_lit)
86a62d
+    if (s->sym_next)
86a62d
         FLUSH_BLOCK(s, 0);
86a62d
     return block_done;
86a62d
 }
86a62d
@@ -1912,7 +1912,7 @@ local block_state deflate_slow(s, flush)
86a62d
         FLUSH_BLOCK(s, 1);
86a62d
         return finish_done;
86a62d
     }
86a62d
-    if (s->last_lit)
86a62d
+    if (s->sym_next)
86a62d
         FLUSH_BLOCK(s, 0);
86a62d
     return block_done;
86a62d
 }
86a62d
@@ -1987,7 +1987,7 @@ local block_state deflate_rle(s, flush)
86a62d
         FLUSH_BLOCK(s, 1);
86a62d
         return finish_done;
86a62d
     }
86a62d
-    if (s->last_lit)
86a62d
+    if (s->sym_next)
86a62d
         FLUSH_BLOCK(s, 0);
86a62d
     return block_done;
86a62d
 }
86a62d
@@ -2026,7 +2026,7 @@ local block_state deflate_huff(s, flush)
86a62d
         FLUSH_BLOCK(s, 1);
86a62d
         return finish_done;
86a62d
     }
86a62d
-    if (s->last_lit)
86a62d
+    if (s->sym_next)
86a62d
         FLUSH_BLOCK(s, 0);
86a62d
     return block_done;
86a62d
 }
86a62d
diff --git a/zlib/deflate.h b/zlib/deflate.h
86a62d
index 23ecdd312..d4cf1a98b 100644
86a62d
--- a/zlib/deflate.h
86a62d
+++ b/zlib/deflate.h
86a62d
@@ -217,7 +217,7 @@ typedef struct internal_state {
86a62d
     /* Depth of each subtree used as tie breaker for trees of equal frequency
86a62d
      */
86a62d
 
86a62d
-    uchf *l_buf;          /* buffer for literals or lengths */
86a62d
+    uchf *sym_buf;        /* buffer for distances and literals/lengths */
86a62d
 
86a62d
     uInt  lit_bufsize;
86a62d
     /* Size of match buffer for literals/lengths.  There are 4 reasons for
86a62d
@@ -239,13 +239,8 @@ typedef struct internal_state {
86a62d
      *   - I can't count above 4
86a62d
      */
86a62d
 
86a62d
-    uInt last_lit;      /* running index in l_buf */
86a62d
-
86a62d
-    ushf *d_buf;
86a62d
-    /* Buffer for distances. To simplify the code, d_buf and l_buf have
86a62d
-     * the same number of elements. To use different lengths, an extra flag
86a62d
-     * array would be necessary.
86a62d
-     */
86a62d
+    uInt sym_next;      /* running index in sym_buf */
86a62d
+    uInt sym_end;       /* symbol table full when sym_next reaches this */
86a62d
 
86a62d
     ulg opt_len;        /* bit length of current block with optimal trees */
86a62d
     ulg static_len;     /* bit length of current block with static trees */
86a62d
@@ -317,20 +317,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
86a62d
 
86a62d
 # define _tr_tally_lit(s, c, flush) \
86a62d
   { uch cc = (c); \
86a62d
-    s->d_buf[s->last_lit] = 0; \
86a62d
-    s->l_buf[s->last_lit++] = cc; \
86a62d
+    s->sym_buf[s->sym_next++] = 0; \
86a62d
+    s->sym_buf[s->sym_next++] = 0; \
86a62d
+    s->sym_buf[s->sym_next++] = cc; \
86a62d
     s->dyn_ltree[cc].Freq++; \
86a62d
-    flush = (s->last_lit == s->lit_bufsize-1); \
86a62d
+    flush = (s->sym_next == s->sym_end); \
86a62d
    }
86a62d
 # define _tr_tally_dist(s, distance, length, flush) \
86a62d
   { uch len = (length); \
86a62d
     ush dist = (distance); \
86a62d
-    s->d_buf[s->last_lit] = dist; \
86a62d
-    s->l_buf[s->last_lit++] = len; \
86a62d
+    s->sym_buf[s->sym_next++] = dist; \
86a62d
+    s->sym_buf[s->sym_next++] = dist >> 8; \
86a62d
+    s->sym_buf[s->sym_next++] = len; \
86a62d
     dist--; \
86a62d
     s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
86a62d
     s->dyn_dtree[d_code(dist)].Freq++; \
86a62d
-    flush = (s->last_lit == s->lit_bufsize-1); \
86a62d
+    flush = (s->sym_next == s->sym_end); \
86a62d
   }
86a62d
 #else
86a62d
 # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
86a62d
diff --git a/zlib/trees.c b/zlib/trees.c
86a62d
index 4f4a65011..decaeb7c3 100644
86a62d
--- a/zlib/trees.c
86a62d
+++ b/zlib/trees.c
86a62d
@@ -416,7 +416,7 @@ local void init_block(s)
86a62d
 
86a62d
     s->dyn_ltree[END_BLOCK].Freq = 1;
86a62d
     s->opt_len = s->static_len = 0L;
86a62d
-    s->last_lit = s->matches = 0;
86a62d
+    s->sym_next = s->matches = 0;
86a62d
 }
86a62d
 
86a62d
 #define SMALLEST 1
86a62d
@@ -948,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
86a62d
 
86a62d
         Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
86a62d
                 opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
86a62d
-                s->last_lit));
86a62d
+                s->sym_next / 3));
86a62d
 
86a62d
         if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
86a62d
 
86a62d
@@ -1017,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
86a62d
     unsigned dist;  /* distance of matched string */
86a62d
     unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
86a62d
 {
86a62d
-    s->d_buf[s->last_lit] = (ush)dist;
86a62d
-    s->l_buf[s->last_lit++] = (uch)lc;
86a62d
+    s->sym_buf[s->sym_next++] = dist;
86a62d
+    s->sym_buf[s->sym_next++] = dist >> 8;
86a62d
+    s->sym_buf[s->sym_next++] = lc;
86a62d
     if (dist == 0) {
86a62d
         /* lc is the unmatched char */
86a62d
         s->dyn_ltree[lc].Freq++;
86a62d
@@ -1033,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
86a62d
         s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
86a62d
         s->dyn_dtree[d_code(dist)].Freq++;
86a62d
     }
86a62d
-
86a62d
-#ifdef TRUNCATE_BLOCK
86a62d
-    /* Try to guess if it is profitable to stop the current block here */
86a62d
-    if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
86a62d
-        /* Compute an upper bound for the compressed length */
86a62d
-        ulg out_length = (ulg)s->last_lit*8L;
86a62d
-        ulg in_length = (ulg)((long)s->strstart - s->block_start);
86a62d
-        int dcode;
86a62d
-        for (dcode = 0; dcode < D_CODES; dcode++) {
86a62d
-            out_length += (ulg)s->dyn_dtree[dcode].Freq *
86a62d
-                (5L+extra_dbits[dcode]);
86a62d
-        }
86a62d
-        out_length >>= 3;
86a62d
-        Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
86a62d
-               s->last_lit, in_length, out_length,
86a62d
-               100L - out_length*100L/in_length));
86a62d
-        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
86a62d
-    }
86a62d
-#endif
86a62d
-    return (s->last_lit == s->lit_bufsize-1);
86a62d
-    /* We avoid equality with lit_bufsize because of wraparound at 64K
86a62d
-     * on 16 bit machines and because stored blocks are restricted to
86a62d
-     * 64K-1 bytes.
86a62d
-     */
86a62d
+    return (s->sym_next == s->sym_end);
86a62d
 }
86a62d
 
86a62d
 /* ===========================================================================
86a62d
@@ -1069,13 +1047,14 @@ local void compress_block(s, ltree, dtree)
86a62d
 {
86a62d
     unsigned dist;      /* distance of matched string */
86a62d
     int lc;             /* match length or unmatched char (if dist == 0) */
86a62d
-    unsigned lx = 0;    /* running index in l_buf */
86a62d
+    unsigned sx = 0;    /* running index in sym_buf */
86a62d
     unsigned code;      /* the code to send */
86a62d
     int extra;          /* number of extra bits to send */
86a62d
 
86a62d
-    if (s->last_lit != 0) do {
86a62d
-        dist = s->d_buf[lx];
86a62d
-        lc = s->l_buf[lx++];
86a62d
+    if (s->sym_next != 0) do {
86a62d
+        dist = s->sym_buf[sx++] & 0xff;
86a62d
+        dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
86a62d
+        lc = s->sym_buf[sx++];
86a62d
         if (dist == 0) {
86a62d
             send_code(s, lc, ltree); /* send a literal byte */
86a62d
             Tracecv(isgraph(lc), (stderr," '%c' ", lc));
86a62d
@@ -1100,11 +1079,10 @@ local void compress_block(s, ltree, dtree)
86a62d
             }
86a62d
         } /* literal or match pair ? */
86a62d
 
86a62d
-        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
86a62d
-        Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
86a62d
-               "pendingBuf overflow");
86a62d
+        /* Check that the overlay between pending_buf and sym_buf is ok: */
86a62d
+        Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
86a62d
 
86a62d
-    } while (lx < s->last_lit);
86a62d
+    } while (sx < s->sym_next);
86a62d
 
86a62d
     send_code(s, END_BLOCK, ltree);
86a62d
 }