Skip to content

Commit

Permalink
Fix bug #72749: wddx_deserialize allows illegal memory access
Browse files Browse the repository at this point in the history
Assigned CVE-IDs: CVE-2016-7129

(cherry picked from commit 426aeb2)
Signed-off-by: Lior Kaplan <kaplanlior@gmail.com>
  • Loading branch information
smalyshev authored and kaplanlior committed Sep 22, 2016
1 parent cdfa5ad commit 2fb7c78
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 6 deletions.
34 changes: 34 additions & 0 deletions ext/wddx/tests/bug72749.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
--TEST--
Bug #72749: wddx_deserialize allows illegal memory access
--SKIPIF--
<?php
if (!extension_loaded('wddx')) {
die('skip. wddx not available');
}
?>
--FILE--
<?php
$xml = <<<XML
<?xml version='1.0'?>
<!DOCTYPE wddxPacket SYSTEM 'wddx_0100.dtd'>
<wddxPacket version='1.0'>
<header/>
<data>
<struct>
<var name='aDateTime3'>
<dateTime>2\r2004-09-10T05:52:49+00</dateTime>
</var>
</struct>
</data>
</wddxPacket>
XML;

$array = wddx_deserialize($xml);
var_dump($array);
?>
--EXPECT--
array(1) {
["aDateTime3"]=>
string(24) "2
2004-09-10T05:52:49+00"
}
20 changes: 14 additions & 6 deletions ext/wddx/wddx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1117,18 +1117,26 @@ static void php_wddx_process_data(void *user_data, const XML_Char *s, int len)
case ST_DATETIME: {
char *tmp;

tmp = emalloc(len + 1);
memcpy(tmp, s, len);
if (Z_TYPE_P(ent->data) == IS_STRING) {
tmp = safe_emalloc(Z_STRLEN_P(ent->data), 1, (size_t)len + 1);
memcpy(tmp, Z_STRVAL_P(ent->data), Z_STRLEN_P(ent->data));
memcpy(tmp + Z_STRLEN_P(ent->data), s, len);
len += Z_STRLEN_P(ent->data);
efree(Z_STRVAL_P(ent->data));
Z_TYPE_P(ent->data) = IS_LONG;
} else {
tmp = emalloc(len + 1);
memcpy(tmp, s, len);
}
tmp[len] = '\0';

Z_LVAL_P(ent->data) = php_parse_date(tmp, NULL);
/* date out of range < 1969 or > 2038 */
if (Z_LVAL_P(ent->data) == -1) {
Z_TYPE_P(ent->data) = IS_STRING;
Z_STRLEN_P(ent->data) = len;
Z_STRVAL_P(ent->data) = estrndup(s, len);
ZVAL_STRINGL(ent->data, tmp, len, 0);
} else {
efree(tmp);
}
efree(tmp);
}
break;

Expand Down

0 comments on commit 2fb7c78

Please sign in to comment.