1 |
Patch for PHP 5.3.3 adapted from: |
2 |
|
3 |
From 22736b7c56d678f142d5dd21f4996e5819507a2b Mon Sep 17 00:00:00 2001 |
4 |
From: Stanislav Malyshev <stas@php.net> |
5 |
Date: Mon, 26 May 2014 17:42:18 -0700 |
6 |
Subject: [PATCH] Fix bug #67327: fileinfo: CDF infinite loop in nelements DoS |
7 |
|
8 |
Upstream fix: https://github.com/file/file/commit/f97486ef5dc3e8735440edc4fc8808c63e1a3ef0 |
9 |
--- |
10 |
ext/fileinfo/libmagic/cdf.c | 8 +++++++- |
11 |
1 file changed, 7 insertions(+), 1 deletion(-) |
12 |
|
13 |
diff --git a/ext/fileinfo/libmagic/cdf.c b/ext/fileinfo/libmagic/cdf.c |
14 |
index 8dacd2f..4712e84 100644 |
15 |
--- a/ext/fileinfo/libmagic/cdf.c |
16 |
+++ b/ext/fileinfo/libmagic/cdf.c |
17 |
@@ -760,6 +760,10 @@ cdf_read_property_info(const cdf_stream_ |
18 |
inp[i].pi_type, (const char *)q - (const char *)p)); |
19 |
if (inp[i].pi_type & CDF_VECTOR) { |
20 |
nelements = CDF_TOLE4(q[1]); |
21 |
+ if (nelements == 0) { |
22 |
+ DPRINTF(("CDF_VECTOR with nelements == 0\n")); |
23 |
+ goto out; |
24 |
+ } |
25 |
o = 2; |
26 |
} else { |
27 |
nelements = 1; |
28 |
@@ -815,7 +819,8 @@ cdf_read_property_info(const cdf_stream_ |
29 |
inp = *info + nelem; |
30 |
} |
31 |
DPRINTF(("nelements = %d\n", nelements)); |
32 |
- for (j = 0; j < nelements; j++, i++) { |
33 |
+ for (j = 0; j < nelements && i < sh.sh_properties; |
34 |
+ j++, i++) { |
35 |
uint32_t l = CDF_TOLE4(q[o]); |
36 |
inp[i].pi_str.s_len = l; |
37 |
inp[i].pi_str.s_buf = (const char *)(&q[o+1]); |
38 |
-- |
39 |
1.9.2 |
40 |
|