]> granicus.if.org Git - php/commitdiff
Fix #73159: imagegd2(): unrecognized formats may result in corrupted files
authorChristoph M. Becker <cmbecker69@gmx.de>
Sat, 24 Sep 2016 09:28:20 +0000 (11:28 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Sat, 24 Sep 2016 09:28:20 +0000 (11:28 +0200)
We must not apply the format correction twice for truecolor images.

NEWS
ext/gd/libgd/gd_gd2.c
ext/gd/tests/bug73159.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index c0cefbae205552a694cfd9e4558719476bf4d20f..a7a71846bb200544d4ad9abf91dee611bc809ef0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -28,6 +28,8 @@ PHP                                                                        NEWS
     (Mark Plomer, cmb)
   . Fixed bug #73157 (imagegd2() ignores 3rd param if 4 are given). (cmb)
   . Fixed bug #73155 (imagegd2() writes wrong chunk sizes on boundaries). (cmb)
+  . Fixed bug #73159 (imagegd2(): unrecognized formats may result in corrupted
+    files). (cmb)
 
 - Mbstring:
   . Fixed bug #72994 (mbc_to_code() out of bounds read). (Laruence, cmb)
index 3b4dfbe098a6056242fbdcf4f63267f261042001..57d5844510f14ef413da73f53bece499d847067e 100644 (file)
@@ -670,7 +670,7 @@ static void _gdImageGd2 (gdImagePtr im, gdIOCtx * out, int cs, int fmt)
 
        /* Force fmt to a valid value since we don't return anything. */
        if ((fmt != GD2_FMT_RAW) && (fmt != GD2_FMT_COMPRESSED)) {
-               fmt = im->trueColor ? GD2_FMT_TRUECOLOR_COMPRESSED : GD2_FMT_COMPRESSED;
+               fmt = GD2_FMT_COMPRESSED;
        }
        if (im->trueColor) {
                fmt += 2;
diff --git a/ext/gd/tests/bug73159.phpt b/ext/gd/tests/bug73159.phpt
new file mode 100644 (file)
index 0000000..4889ffb
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #73159 (imagegd2(): unrecognized formats may result in corrupted files)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+$im = imagecreatetruecolor(10, 10);
+
+ob_start();
+imagegd2($im, null, 128, 0);
+$buffer = ob_get_clean();
+
+$header = unpack('@12/nformat', $buffer);
+printf("format: %d\n", $header['format']);
+?>
+===DONE===
+--EXPECT--
+format: 4
+===DONE===