]> granicus.if.org Git - php/commitdiff
Fix #79615: Wrong GIF header written in GD GIFEncode
authorChristoph M. Becker <cmbecker69@gmx.de>
Fri, 22 May 2020 07:11:28 +0000 (09:11 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Fri, 22 May 2020 07:15:41 +0000 (09:15 +0200)
The color resolution is expected in bits 4-6 of the packed fields byte
of the logical screen descriptor (byte 10 of the GIF data stream),
according to the specification[1], section 18.

[1] <https://www.w3.org/Graphics/GIF/spec-gif89a.txt>

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

diff --git a/NEWS b/NEWS
index dbb6da2c7fda48027f5e80b5a18e11e01fbb688e..f9ae00e8e4fa6c2617fd01dabf1217ccfe0b92e9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,9 @@ PHP                                                                        NEWS
   . Fixed bug #79566 (Private SHM is not private on Windows). (cmb)
   . Fixed bug #79489 (.user.ini does not inherit). (cmb)
 
+- GD:
+  . Fixed bug #79615 (Wrong GIF header written in GD GIFEncode). (sageptr, cmb)
+
 - MySQLnd:
   . Fixed bug #79596 (MySQL FLOAT truncates to int some locales). (cmb)
 
index c0a0433f4d78c17b5f8e14652a9a01385c5c0aee..771e8afe2e2688b203705b05cc3d1e8ac45cf35e 100644 (file)
@@ -319,7 +319,7 @@ GIFEncode(gdIOCtxPtr fp, int GWidth, int GHeight, int GInterlace, int Background
         /*
          * OR in the resolution
          */
-        B |= (Resolution - 1) << 5;
+        B |= (Resolution - 1) << 4;
 
         /*
          * OR in the Bits per Pixel
diff --git a/ext/gd/tests/bug79615.phpt b/ext/gd/tests/bug79615.phpt
new file mode 100644 (file)
index 0000000..b7cf917
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #79615 (Wrong GIF header written in GD GIFEncode)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+$im = imagecreate(3, 3); // 3x3, 9 colors, 4 bits per pixel
+for ($x = 0; $x < 3; $x++) {
+    for ($y = 0; $y < 3; $y++) {
+        imagesetpixel($im, $x, $y, imagecolorallocate($im, $x, $y, 0));
+    }
+}
+ob_start();
+imagegif($im);
+echo decbin(ord(ob_get_clean()[0xA]));
+?>
+--EXPECT--
+10110011