]> granicus.if.org Git - php/commitdiff
Fix #73869: Signed Integer Overflow gd_io.c
authorChristoph M. Becker <cmbecker69@gmx.de>
Sat, 17 Dec 2016 16:06:58 +0000 (17:06 +0100)
committerAnatol Belski <ab@php.net>
Tue, 17 Jan 2017 08:30:58 +0000 (09:30 +0100)
GD2 stores the number of horizontal and vertical chunks as words (i.e. 2
byte unsigned). These values are multiplied and assigned to an int when
reading the image, what can cause integer overflows. We have to avoid
that, and also make sure that either chunk count is actually greater
than zero. If illegal chunk counts are detected, we bail out from
reading the image.

(cherry picked from commit 5b5d9db3988b829e0b121b74bb3947f01c2796a1)

ext/gd/libgd/gd_gd2.c
ext/gd/tests/bug73869.phpt [new file with mode: 0644]
ext/gd/tests/bug73869a.gd2 [new file with mode: 0644]
ext/gd/tests/bug73869b.gd2 [new file with mode: 0644]

index 196b7858dc4c0297cff4eecabbbdb542bc15e377..3eba6b3054f278bce01ead6edee462425f8328f6 100644 (file)
@@ -136,6 +136,10 @@ static int _gd2GetHeader(gdIOCtxPtr in, int *sx, int *sy, int *cs, int *vers, in
        GD2_DBG(php_gd_error("%d Chunks vertically", *ncy));
 
        if (gd2_compressed(*fmt)) {
+               if (*ncx <= 0 || *ncy <= 0 || *ncx > INT_MAX / *ncy) {
+                       GD2_DBG(printf ("Illegal chunk counts: %d * %d\n", *ncx, *ncy));
+                       goto fail1;
+               }
                nc = (*ncx) * (*ncy);
                GD2_DBG(php_gd_error("Reading %d chunk index entries", nc));
                if (overflow2(sizeof(t_chunk_info), nc)) {
diff --git a/ext/gd/tests/bug73869.phpt b/ext/gd/tests/bug73869.phpt
new file mode 100644 (file)
index 0000000..3cc10a4
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Bug #73869 (Signed Integer Overflow gd_io.c)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+var_dump(imagecreatefromgd2(__DIR__ . DIRECTORY_SEPARATOR . 'bug73869a.gd2'));
+var_dump(imagecreatefromgd2(__DIR__ . DIRECTORY_SEPARATOR . 'bug73869b.gd2'));
+?>
+===DONE===
+--EXPECTF--
+Warning: imagecreatefromgd2(): '%s' is not a valid GD2 file in %s on line %d
+bool(false)
+
+Warning: imagecreatefromgd2(): '%s' is not a valid GD2 file in %s on line %d
+bool(false)
+===DONE===
\ No newline at end of file
diff --git a/ext/gd/tests/bug73869a.gd2 b/ext/gd/tests/bug73869a.gd2
new file mode 100644 (file)
index 0000000..5060bfd
Binary files /dev/null and b/ext/gd/tests/bug73869a.gd2 differ
diff --git a/ext/gd/tests/bug73869b.gd2 b/ext/gd/tests/bug73869b.gd2
new file mode 100644 (file)
index 0000000..8600126
Binary files /dev/null and b/ext/gd/tests/bug73869b.gd2 differ