Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Please unblock package mupdf

[ Reason ]
To fix two CVEs
- - https://security-tracker.debian.org/tracker/CVE-2021-37220
- - https://security-tracker.debian.org/tracker/CVE-2020-19609

[ Impact ]
Potential denial of service caused by crashes or arbitrary code
execution caused by buffer overflow

[ Tests ]
I tested manually with reproducer files from upstream bug reports.
I also did some regression test with some PDF files.

[ Risks ]
Risks should be low. The changes are cherry-picked from
upstream and there weren't any other changes applied by upstream
between the two versions. The risk of faulty backport is low.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
The source package src:mupdf produces the following binary packages:
- - mupdf
- - mupdf-dbgsym
- - mupdf-tools
- - mupdf-tools-dbgsym
- - libmupdf-dev

unblock mupdf/1.17.0+ds1-2


-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEE2JDTPWFH4vUeM4aHCjk1SrblfeEFAmD6g1sACgkQCjk1Srbl
feE/yQ/+KQEr5VOfJhJabt13ZZKLwE2ktpOgU4OwkfwlZy5Z5VoBC+r2WpIdL/TP
k1VbDEXgc57Yd+ZlHRe1baIYc9oiz7YnYyGpnUUVLOGrILqKqFOOtWLFpoa3fzwL
9uQu0trzUahJawdQDQq7Fp5GBkA3U/+KCtZ7+f9/33ACVioxv3S3LIsfDLnLztN3
E68ZjdasSXPX3GGWbUgkY7RG8h+47CNb3Vw+4Y50kN3zucM7PjP/8pdc6d4p6SoC
B6ad3bGyI1t9leaTwB9XRGDlCPNo1I73LcTNM1Uw9WCuPzSyavnpwL/lEATJLfuQ
nsfT3+9yNv+lgCtIEzG/UABFP6FpEqwOcna4zwCRSH78Q3UiICSULEr/nx9H/DRj
+vDwuWKXp7+Y/0CwVyJASf9YiSmcj0m2SJ/Z0GHRvytwtpQKEyRVjisYGDb9gJJ0
X/3gTyvwvox6OKY4Oh8qUgdLfPZUUeIAvwTZCRONNXss8SXKvSdopfq1RrdAnNy1
fVCvp9CvsGX34e11ZU0Fnna+9Ze+eAjFykssv3En1hgGdWoIMDNo+aSP68W9GtGb
FmxCwP2o39B4Uu7cU8WWcTPe8GgJBFNHZmqW9VBxO/zwFJNBrOM1Mz0aNbKwfsXz
X6dW7PlonVR2M0rwhlgRgYp0ir2+hK87HEiQJvbnS5gabTAFyBo=
=C38i
-----END PGP SIGNATURE-----
diff -Nru mupdf-1.17.0+ds1/debian/changelog mupdf-1.17.0+ds1/debian/changelog
--- mupdf-1.17.0+ds1/debian/changelog   2021-02-28 21:40:40.000000000 +0900
+++ mupdf-1.17.0+ds1/debian/changelog   2021-07-23 17:09:37.000000000 +0900
@@ -1,3 +1,11 @@
+mupdf (1.17.0+ds1-2) unstable; urgency=medium
+
+  * Fix buffer overrun in tiff decoder (CVE-2020-19609) (Closes: #991401)
+  * Stay within hash table max key size in cached color converter
+    (CVE-2021-37220) (Closes: #991402)
+
+ -- Kan-Ru Chen (陳侃如) <kos...@debian.org>  Fri, 23 Jul 2021 17:09:37 +0900
+
 mupdf (1.17.0+ds1-1.3) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru 
mupdf-1.17.0+ds1/debian/patches/0012-tiff-Avoid-limiting-palette-colors-to-8-bits.patch
 
mupdf-1.17.0+ds1/debian/patches/0012-tiff-Avoid-limiting-palette-colors-to-8-bits.patch
--- 
mupdf-1.17.0+ds1/debian/patches/0012-tiff-Avoid-limiting-palette-colors-to-8-bits.patch
     1970-01-01 09:00:00.000000000 +0900
+++ 
mupdf-1.17.0+ds1/debian/patches/0012-tiff-Avoid-limiting-palette-colors-to-8-bits.patch
     2021-07-23 16:54:49.000000000 +0900
@@ -0,0 +1,65 @@
+From: Sebastian Rasmussen <seb...@gmail.com>
+Date: Fri, 23 Jul 2021 16:32:29 +0900
+Subject: tiff: Avoid limiting palette colors to 8 bits.
+
+Previously fz_unpack_tile() could not handle >8 bit images,
+so palettized tiff colors had to be limited to 8 bits.
+Now when fz_unpack_tile() does handles >8 bit images do not
+limit the samples in the colormap to 8 bits.
+
+This fixes Coverity CID 150612.
+
+Cherry-picked-from: 
http://git.ghostscript.com/?p=mupdf.git;a=commitdiff;h=666c62d491ca76ade9a281dfe4c4e945cc71f8e8
+---
+ source/fitz/load-tiff.c | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/source/fitz/load-tiff.c b/source/fitz/load-tiff.c
+index c7c0bcf..bb69e2f 100644
+--- a/source/fitz/load-tiff.c
++++ b/source/fitz/load-tiff.c
+@@ -253,7 +253,7 @@ tiff_expand_colormap(fz_context *ctx, struct tiff *tiff)
+       if (tiff->imagelength > UINT_MAX / tiff->imagewidth / 
(tiff->samplesperpixel + 2))
+               fz_throw(ctx, FZ_ERROR_GENERIC, "image too large");
+ 
+-      stride = tiff->imagewidth * (tiff->samplesperpixel + 2);
++      stride = tiff->imagewidth * (tiff->samplesperpixel + 2) * 2;
+ 
+       samples = Memento_label(fz_malloc(ctx, stride * tiff->imagelength), 
"tiff_samples");
+ 
+@@ -269,25 +269,31 @@ tiff_expand_colormap(fz_context *ctx, struct tiff *tiff)
+                               int c = tiff_getcomp(src, x * 2, 
tiff->bitspersample);
+                               int a = tiff_getcomp(src, x * 2 + 1, 
tiff->bitspersample);
+                               *dst++ = tiff->colormap[c + 0] >> 8;
++                              *dst++ = tiff->colormap[c + 0];
+                               *dst++ = tiff->colormap[c + maxval] >> 8;
++                              *dst++ = tiff->colormap[c + maxval];
+                               *dst++ = tiff->colormap[c + maxval * 2] >> 8;
+-                              if (tiff->bitspersample <= 8)
+-                                      *dst++ = a << (8 - tiff->bitspersample);
++                              *dst++ = tiff->colormap[c + maxval * 2];
++                              if (tiff->bitspersample <= 16)
++                                      *dst++ = a << (16 - 
tiff->bitspersample);
+                               else
+-                                      *dst++ = a >> (tiff->bitspersample - 8);
++                                      *dst++ = a >> (tiff->bitspersample - 
16);
+                       }
+                       else
+                       {
+                               int c = tiff_getcomp(src, x, 
tiff->bitspersample);
+                               *dst++ = tiff->colormap[c + 0] >> 8;
++                              *dst++ = tiff->colormap[c + 0];
+                               *dst++ = tiff->colormap[c + maxval] >> 8;
++                              *dst++ = tiff->colormap[c + maxval];
+                               *dst++ = tiff->colormap[c + maxval * 2] >> 8;
++                              *dst++ = tiff->colormap[c + maxval * 2];
+                       }
+               }
+       }
+ 
+       tiff->samplesperpixel += 2;
+-      tiff->bitspersample = 8;
++      tiff->bitspersample = 16;
+       tiff->stride = stride;
+       fz_free(ctx, tiff->samples);
+       tiff->samples = samples;
diff -Nru 
mupdf-1.17.0+ds1/debian/patches/0013-Bug-703076-Fix-buffer-overrun-in-tiff-decoder.patch
 
mupdf-1.17.0+ds1/debian/patches/0013-Bug-703076-Fix-buffer-overrun-in-tiff-decoder.patch
--- 
mupdf-1.17.0+ds1/debian/patches/0013-Bug-703076-Fix-buffer-overrun-in-tiff-decoder.patch
    1970-01-01 09:00:00.000000000 +0900
+++ 
mupdf-1.17.0+ds1/debian/patches/0013-Bug-703076-Fix-buffer-overrun-in-tiff-decoder.patch
    2021-07-23 16:54:49.000000000 +0900
@@ -0,0 +1,87 @@
+From: Robin Watts <robin.wa...@artifex.com>
+Date: Fri, 23 Jul 2021 16:35:21 +0900
+Subject: Bug 703076: Fix buffer overrun in tiff decoder.
+
+Harden tiff_expand_colormap against badly formed TIFFs.
+Correctly allocate space, and avoid overreading. Skip any excess
+input data.
+
+Cherry-picked-from: 
http://git.ghostscript.com/?p=mupdf.git;a=commitdiff;h=2c4f11f8dcdbd18c35a65e58cc789be0e46012a8
+---
+ source/fitz/load-tiff.c | 42 +++++++++++++++++++++---------------------
+ 1 file changed, 21 insertions(+), 21 deletions(-)
+
+diff --git a/source/fitz/load-tiff.c b/source/fitz/load-tiff.c
+index bb69e2f..40db0fe 100644
+--- a/source/fitz/load-tiff.c
++++ b/source/fitz/load-tiff.c
+@@ -236,6 +236,7 @@ tiff_expand_colormap(fz_context *ctx, struct tiff *tiff)
+       unsigned char *src, *dst;
+       unsigned int x, y;
+       unsigned int stride;
++      unsigned int srcstride;
+ 
+       /* colormap has first all red, then all green, then all blue values */
+       /* colormap values are 0..65535, bits is 4 or 8 */
+@@ -253,41 +254,40 @@ tiff_expand_colormap(fz_context *ctx, struct tiff *tiff)
+       if (tiff->imagelength > UINT_MAX / tiff->imagewidth / 
(tiff->samplesperpixel + 2))
+               fz_throw(ctx, FZ_ERROR_GENERIC, "image too large");
+ 
+-      stride = tiff->imagewidth * (tiff->samplesperpixel + 2) * 2;
++      srcstride = ((1 + tiff->extrasamples) * tiff->bitspersample + 7) & ~7;
++      if (tiff->stride < 0 || srcstride > (unsigned int)tiff->stride)
++              fz_throw(ctx, FZ_ERROR_GENERIC, "insufficient data for format");
++
++      stride = tiff->imagewidth * (3 + !!tiff->extrasamples) * 2;
+ 
+       samples = Memento_label(fz_malloc(ctx, stride * tiff->imagelength), 
"tiff_samples");
+ 
+       for (y = 0; y < tiff->imagelength; y++)
+       {
++              int s = 0;
+               src = tiff->samples + (unsigned int)(tiff->stride * y);
+               dst = samples + (unsigned int)(stride * y);
+ 
+               for (x = 0; x < tiff->imagewidth; x++)
+               {
++                      int c = tiff_getcomp(src, s++, tiff->bitspersample);
++                      *dst++ = tiff->colormap[c + 0] >> 8;
++                      *dst++ = tiff->colormap[c + 0];
++                      *dst++ = tiff->colormap[c + maxval] >> 8;
++                      *dst++ = tiff->colormap[c + maxval];
++                      *dst++ = tiff->colormap[c + maxval * 2] >> 8;
++                      *dst++ = tiff->colormap[c + maxval * 2];
+                       if (tiff->extrasamples)
+                       {
+-                              int c = tiff_getcomp(src, x * 2, 
tiff->bitspersample);
+-                              int a = tiff_getcomp(src, x * 2 + 1, 
tiff->bitspersample);
+-                              *dst++ = tiff->colormap[c + 0] >> 8;
+-                              *dst++ = tiff->colormap[c + 0];
+-                              *dst++ = tiff->colormap[c + maxval] >> 8;
+-                              *dst++ = tiff->colormap[c + maxval];
+-                              *dst++ = tiff->colormap[c + maxval * 2] >> 8;
+-                              *dst++ = tiff->colormap[c + maxval * 2];
++                              /* Assume the first is alpha, and skip the 
rest. */
++                              int a = tiff_getcomp(src, s++, 
tiff->bitspersample);
+                               if (tiff->bitspersample <= 16)
+-                                      *dst++ = a << (16 - 
tiff->bitspersample);
++                                      a = a << (16 - tiff->bitspersample);
+                               else
+-                                      *dst++ = a >> (tiff->bitspersample - 
16);
+-                      }
+-                      else
+-                      {
+-                              int c = tiff_getcomp(src, x, 
tiff->bitspersample);
+-                              *dst++ = tiff->colormap[c + 0] >> 8;
+-                              *dst++ = tiff->colormap[c + 0];
+-                              *dst++ = tiff->colormap[c + maxval] >> 8;
+-                              *dst++ = tiff->colormap[c + maxval];
+-                              *dst++ = tiff->colormap[c + maxval * 2] >> 8;
+-                              *dst++ = tiff->colormap[c + maxval * 2];
++                                      a = a >> (tiff->bitspersample - 16);
++                              *dst++ = a >> 8;
++                              *dst++ = a;
++                              s += tiff->extrasamples-1;
+                       }
+               }
+       }
diff -Nru 
mupdf-1.17.0+ds1/debian/patches/0014-Bug-703791-Stay-within-hash-table-max-key-size-in-ca.patch
 
mupdf-1.17.0+ds1/debian/patches/0014-Bug-703791-Stay-within-hash-table-max-key-size-in-ca.patch
--- 
mupdf-1.17.0+ds1/debian/patches/0014-Bug-703791-Stay-within-hash-table-max-key-size-in-ca.patch
     1970-01-01 09:00:00.000000000 +0900
+++ 
mupdf-1.17.0+ds1/debian/patches/0014-Bug-703791-Stay-within-hash-table-max-key-size-in-ca.patch
     2021-07-23 16:54:49.000000000 +0900
@@ -0,0 +1,113 @@
+From: Tor Andersson <tor.anders...@artifex.com>
+Date: Fri, 23 Jul 2021 16:54:00 +0900
+Subject: Bug 703791: Stay within hash table max key size in cached color
+ converter.
+
+Cherry-picked-from: 
http://git.ghostscript.com/?p=mupdf.git;h=f5712c9949d026e4b891b25837edd2edc166151f
+---
+ include/mupdf/fitz/hash.h |  2 ++
+ source/fitz/colorspace.c  | 40 +++++++++++++++++++++++++---------------
+ source/fitz/hash.c        |  7 +++----
+ 3 files changed, 30 insertions(+), 19 deletions(-)
+
+diff --git a/include/mupdf/fitz/hash.h b/include/mupdf/fitz/hash.h
+index ab6159e..6a1b87f 100644
+--- a/include/mupdf/fitz/hash.h
++++ b/include/mupdf/fitz/hash.h
+@@ -5,6 +5,8 @@
+ #include "mupdf/fitz/context.h"
+ #include "mupdf/fitz/output.h"
+ 
++#define FZ_HASH_TABLE_KEY_LENGTH 48
++
+ /**
+       Generic hash-table with fixed-length keys.
+ 
+diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c
+index b095a7c..200f264 100644
+--- a/source/fitz/colorspace.c
++++ b/source/fitz/colorspace.c
+@@ -990,23 +990,30 @@ typedef struct fz_cached_color_converter
+ static void fz_cached_color_convert(fz_context *ctx, fz_color_converter *cc_, 
const float *ss, float *ds)
+ {
+       fz_cached_color_converter *cc = cc_->opaque;
+-      float *val = fz_hash_find(ctx, cc->hash, ss);
+-      int n = cc->base.ds->n * sizeof(float);
+-
+-      if (val)
++      if (cc->hash)
+       {
+-              memcpy(ds, val, n);
+-              return;
+-      }
++              float *val = fz_hash_find(ctx, cc->hash, ss);
++              int n = cc->base.ds->n * sizeof(float);
+ 
+-      cc->base.convert(ctx, &cc->base, ss, ds);
++              if (val)
++              {
++                      memcpy(ds, val, n);
++                      return;
++              }
+ 
+-      val = Memento_label(fz_malloc_array(ctx, cc->base.ds->n, float), 
"cached_color_convert");
+-      memcpy(val, ds, n);
+-      fz_try(ctx)
+-              fz_hash_insert(ctx, cc->hash, ss, val);
+-      fz_catch(ctx)
+-              fz_free(ctx, val);
++              cc->base.convert(ctx, &cc->base, ss, ds);
++
++              val = Memento_label(fz_malloc_array(ctx, cc->base.ds->n, 
float), "cached_color_convert");
++              memcpy(val, ds, n);
++              fz_try(ctx)
++                      fz_hash_insert(ctx, cc->hash, ss, val);
++              fz_catch(ctx)
++                      fz_free(ctx, val);
++      }
++      else
++      {
++              cc->base.convert(ctx, &cc->base, ss, ds);
++      }
+ }
+ 
+ void fz_init_cached_color_converter(fz_context *ctx, fz_color_converter *cc, 
fz_colorspace *ss, fz_colorspace *ds, fz_colorspace *is, fz_color_params params)
+@@ -1025,7 +1032,10 @@ void fz_init_cached_color_converter(fz_context *ctx, 
fz_color_converter *cc, fz_
+       fz_try(ctx)
+       {
+               fz_find_color_converter(ctx, &cached->base, ss, ds, is, params);
+-              cached->hash = fz_new_hash_table(ctx, 256, n * sizeof(float), 
-1, fz_free);
++              if (n * sizeof(float) <= FZ_HASH_TABLE_KEY_LENGTH)
++                      cached->hash = fz_new_hash_table(ctx, 256, n * 
sizeof(float), -1, fz_free);
++              else
++                      fz_warn(ctx, "colorspace has too many components to be 
cached");
+       }
+       fz_catch(ctx)
+       {
+diff --git a/source/fitz/hash.c b/source/fitz/hash.c
+index c787f9e..0ff320e 100644
+--- a/source/fitz/hash.c
++++ b/source/fitz/hash.c
+@@ -11,11 +11,9 @@
+       and removed frequently.
+ */
+ 
+-enum { MAX_KEY_LEN = 48 };
+-
+ typedef struct
+ {
+-      unsigned char key[MAX_KEY_LEN];
++      unsigned char key[FZ_HASH_TABLE_KEY_LENGTH];
+       void *val;
+ } fz_hash_entry;
+ 
+@@ -50,7 +48,8 @@ fz_new_hash_table(fz_context *ctx, int initialsize, int 
keylen, int lock, fz_has
+ {
+       fz_hash_table *table;
+ 
+-      assert(keylen <= MAX_KEY_LEN);
++      if (keylen > FZ_HASH_TABLE_KEY_LENGTH)
++              fz_throw(ctx, FZ_ERROR_GENERIC, "hash table key length too 
large");
+ 
+       table = fz_malloc_struct(ctx, fz_hash_table);
+       table->keylen = keylen;
diff -Nru mupdf-1.17.0+ds1/debian/patches/series 
mupdf-1.17.0+ds1/debian/patches/series
--- mupdf-1.17.0+ds1/debian/patches/series      2021-02-28 21:40:40.000000000 
+0900
+++ mupdf-1.17.0+ds1/debian/patches/series      2021-07-23 16:54:49.000000000 
+0900
@@ -9,3 +9,6 @@
 0010-Prevent-thirdparty-archive-build.patch
 0011-Bug-702857-Detect-avoid-overflow-when-calculating-si.patch
 0012-Bug-703366-Fix-double-free-of-object-during-lineariz.patch
+0012-tiff-Avoid-limiting-palette-colors-to-8-bits.patch
+0013-Bug-703076-Fix-buffer-overrun-in-tiff-decoder.patch
+0014-Bug-703791-Stay-within-hash-table-max-key-size-in-ca.patch

Reply via email to