Control: tags 820068 + patch
Control: tags 820068 + pending

Dear maintainer,

I've prepared an NMU for optipng (versioned as 0.7.5-1.1) and uploaded
it to DELAYED/2. Please feel free to tell me if I should delay it
longer. It is exactly the same patch as used by Moritz for the
jessie-security upload. Better would be though to straight go to 0.7.6.

Regards,
Salvatore
diff -Nru optipng-0.7.5/debian/changelog optipng-0.7.5/debian/changelog
--- optipng-0.7.5/debian/changelog	2014-06-11 13:48:44.000000000 +0200
+++ optipng-0.7.5/debian/changelog	2016-04-08 06:53:53.000000000 +0200
@@ -1,3 +1,12 @@
+optipng (0.7.5-1.1) unstable; urgency=high
+
+  * Non-maintainer upload.
+  * CVE-2016-2191: Invalid write while processing delta escapes without
+    any boundary checking (Patch from Moritz Muehlenhoff from the jessie-
+    security upload) (Closes: #820068)
+
+ -- Salvatore Bonaccorso <car...@debian.org>  Fri, 08 Apr 2016 06:26:14 +0200
+
 optipng (0.7.5-1) unstable; urgency=medium
 
   * New upstream release (Closes: #687770)
diff -Nru optipng-0.7.5/debian/patches/CVE-2016-2191.patch optipng-0.7.5/debian/patches/CVE-2016-2191.patch
--- optipng-0.7.5/debian/patches/CVE-2016-2191.patch	1970-01-01 01:00:00.000000000 +0100
+++ optipng-0.7.5/debian/patches/CVE-2016-2191.patch	2016-04-08 06:53:53.000000000 +0200
@@ -0,0 +1,140 @@
+Description: CVE-2016-2191: Invalid write while processing delta escapes without any boundary checking
+Origin: upstream
+Bug: https://sourceforge.net/p/optipng/bugs/59/
+Bug-Debian: https://bugs.debian.org/820068
+Forwarded: not-needed
+Author: Moritz Muehlenhoff <j...@debian.org>
+Last-Update: 2016-04-08
+Applied-Upstream: 0.7.6
+
+--- optipng-0.7.5.orig/src/pngxtern/pngxrbmp.c
++++ optipng-0.7.5/src/pngxtern/pngxrbmp.c
+@@ -108,17 +108,17 @@ bmp_get_dword(png_bytep ptr)
+ 
+ 
+ /*****************************************************************************/
+-/* BMP RLE helpers                                                           */
++/* BMP helpers                                                               */
+ /*****************************************************************************/
+ 
+ static void
+-bmp_rle8_memset(png_bytep ptr, size_t offset, int ch, size_t len)
++bmp_memset_bytes(png_bytep ptr, size_t offset, int ch, size_t len)
+ {
+    memset(ptr + offset, ch, len);
+ }
+ 
+ static void
+-bmp_rle4_memset(png_bytep ptr, size_t offset, int ch, size_t len)
++bmp_memset_halfbytes(png_bytep ptr, size_t offset, int ch, size_t len)
+ {
+    if (len == 0)
+       return;
+@@ -136,7 +136,7 @@ bmp_rle4_memset(png_bytep ptr, size_t of
+ }
+ 
+ static size_t
+-bmp_rle8_fread(png_bytep ptr, size_t offset, size_t len, FILE *stream)
++bmp_fread_bytes(png_bytep ptr, size_t offset, size_t len, FILE *stream)
+ {
+    size_t result;
+ 
+@@ -147,15 +147,17 @@ bmp_rle8_fread(png_bytep ptr, size_t off
+ }
+ 
+ static size_t
+-bmp_rle4_fread(png_bytep ptr, size_t offset, size_t len, FILE *stream)
++bmp_fread_halfbytes(png_bytep ptr, size_t offset, size_t len, FILE *stream)
+ {
+    size_t result;
+    int ch;
+ 
++   if (len == 0)
++      return 0;
+    ptr += offset / 2;
+    if (offset & 1)  /* use half-byte operations at odd offset */
+    {
+-      for (result = 0; result < len; result += 2)
++      for (result = 0; result < len - 1; result += 2)
+       {
+          ch = getc(stream);
+          if (ch == EOF)
+@@ -231,14 +233,14 @@ bmp_read_rows(png_bytepp begin_row, png_
+       endn = row_size * 2;
+       if (endn <= row_size)
+          return 0;  /* overflow */
+-      bmp_memset_fn = bmp_rle4_memset;
+-      bmp_fread_fn = bmp_rle4_fread;
++      bmp_memset_fn = bmp_memset_halfbytes;
++      bmp_fread_fn = bmp_fread_halfbytes;
+    }
+    else
+    {
+       endn = row_size;
+-      bmp_memset_fn = bmp_rle8_memset;
+-      bmp_fread_fn = bmp_rle8_fread;
++      bmp_memset_fn = bmp_memset_bytes;
++      bmp_fread_fn = bmp_fread_bytes;
+    }
+ 
+    if (compression == BI_RGB || compression == BI_BITFIELDS)
+@@ -258,19 +260,14 @@ bmp_read_rows(png_bytepp begin_row, png_
+       if (compression == BI_RLE8)
+       {
+          endn = row_size;
+-         bmp_memset_fn = bmp_rle8_memset;
+-         bmp_fread_fn = bmp_rle8_fread;
+       }
+-      else /* BI_RLE4 */
++      else  /* BI_RLE4 */
+       {
+          endn = row_size * 2;
+          if (endn <= row_size)
+             return 0;  /* overflow */
+-         bmp_memset_fn = bmp_rle4_memset;
+-         bmp_fread_fn = bmp_rle4_fread;
+       }
+-      crt_row = begin_row;
+-      for ( ; ; )
++      for (crt_row = begin_row; crt_row != end_row; )
+       {
+          ch = getc(stream); b1 = (unsigned int)ch;
+          ch = getc(stream); b2 = (unsigned int)ch;
+@@ -300,6 +297,7 @@ bmp_read_rows(png_bytepp begin_row, png_
+             {
+                bmp_memset_fn(*crt_row, crtn, 0, endn - crtn);
+                crt_row += inc;
++               crtn = 0;
+                result = (begin_row <= end_row) ?
+                   (end_row - begin_row) : (begin_row - end_row);
+                break;  /* the rest is wiped out at the end */
+@@ -311,16 +309,17 @@ bmp_read_rows(png_bytepp begin_row, png_
+                if (ch == EOF)
+                   break;
+                dcrtn = (b1 < endn - crtn) ? (crtn + b1) : endn;
+-               if (b2 > (size_t)((end_row - crt_row) * inc))
+-                  b2 = (unsigned int)((end_row - crt_row) * inc);
+                for ( ; b2 > 0; --b2)
+                {
+                   bmp_memset_fn(*crt_row, crtn, 0, endn - crtn);
+                   crt_row += inc;
+                   crtn = 0;
+                   ++result;
++                  if (crt_row == end_row)
++                      break;
+                }
+-               bmp_memset_fn(*crt_row, crtn, 0, dcrtn - crtn);
++               if (crt_row != end_row)
++                  bmp_memset_fn(*crt_row, crtn, 0, dcrtn - crtn);
+             }
+             else  /* b2 >= 3 bytes in absolute mode */
+             {
+@@ -566,7 +565,7 @@ pngx_read_bmp(png_structp png_ptr, png_i
+             rgba_mask[1] = 0x03e0;
+             rgba_mask[2] = 0x001f;
+          }
+-         else /* pixdepth == 24 || pixdepth == 32 */
++         else  /* pixdepth == 24 || pixdepth == 32 */
+          {
+             rgba_mask[0] = (png_uint_32)0x00ff0000L;
+             rgba_mask[1] = (png_uint_32)0x0000ff00L;
diff -Nru optipng-0.7.5/debian/patches/series optipng-0.7.5/debian/patches/series
--- optipng-0.7.5/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
+++ optipng-0.7.5/debian/patches/series	2016-04-08 06:53:53.000000000 +0200
@@ -0,0 +1 @@
+CVE-2016-2191.patch

Reply via email to