com php-src: fix #72519, possible OOB using imagegif: ext/gd/libgd/gd_gif_out.c
| From: | Stanislav Malyshev | Date: | Tue, 19 Jul 2016 07:37:53 +0000 |
| Subject: | com php-src: fix #72519, possible OOB using imagegif: ext/gd/libgd/gd_gif_out.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-93096@lists.php.net to get a copy of this message | ||
Commit: 8dc5ffa479f886fae235d4ff6391e14546a3fda9
Author: Pierre Joye <pierre.php@gmail.com> Tue, 19 Jul 2016 14:11:44 +0700
Committer: Stanislav Malyshev <stas@php.net> Tue, 19 Jul 2016 00:37:53 -0700
Parents: 928aecc002e906b309b28f0062f03d4e5eda3e45
Branches: PHP-5.5
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=8dc5ffa479f886fae235d4ff6391e14546a3fda9
Log:
fix #72519, possible OOB using imagegif
Bugs:
https://bugs.php.net/72519
Changed paths:
M ext/gd/libgd/gd_gif_out.c
Diff:
diff --git a/ext/gd/libgd/gd_gif_out.c b/ext/gd/libgd/gd_gif_out.c
index 1404538..0178dd9 100644
--- a/ext/gd/libgd/gd_gif_out.c
+++ b/ext/gd/libgd/gd_gif_out.c
@@ -601,14 +601,26 @@ nomatch:
* code in turn. When the buffer fills up empty it and start over.
*/
-static unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
+static const unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
0x001F, 0x003F, 0x007F, 0x00FF,
0x01FF, 0x03FF, 0x07FF, 0x0FFF,
0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
+
+/* Arbitrary value to mark output is done. When we see EOFCode, then we don't
+ * expect to see any more data. If we do (e.g. corrupt image inputs), cur_bits
+ * might be negative, so flag it to return early.
+ */
+#define CUR_BITS_FINISHED -1000
+
+
static void
output(code_int code, GifCtx *ctx)
{
+ if (ctx->cur_bits == CUR_BITS_FINISHED) {
+ return;
+ }
+
ctx->cur_accum &= masks[ ctx->cur_bits ];
if( ctx->cur_bits > 0 )
@@ -655,8 +667,10 @@ output(code_int code, GifCtx *ctx)
ctx->cur_bits -= 8;
}
- flush_char(ctx);
+ /* Flag that it's done to prevent re-entry. */
+ ctx->cur_bits = CUR_BITS_FINISHED;
+ flush_char(ctx);
}
}