Skip to content

Commit

Permalink
Fix for bug #72790 and bug #72799
Browse files Browse the repository at this point in the history
  • Loading branch information
smalyshev committed Aug 11, 2016
1 parent 047fe0e commit a14fdb9
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 2 deletions.
35 changes: 35 additions & 0 deletions ext/wddx/tests/bug72790.phpt
@@ -0,0 +1,35 @@
--TEST--
Bug 72790: wddx_deserialize null dereference with invalid xml
--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'>
|array>
<var name="XXXX">
<boolean value="this">
</boolean>
</var>
<var name="YYYY">
<var name="UUUU">
<var name="EZEZ">
</var>
</var>
</var>
</array>
</wddxPacket>
XML;

$array = wddx_deserialize($xml);
var_dump($array);
?>
--EXPECT--
NULL
28 changes: 28 additions & 0 deletions ext/wddx/tests/bug72799.phpt
@@ -0,0 +1,28 @@
--TEST--
Bug #72799: wddx_deserialize null dereference in php_wddx_pop_element
--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">
<var name="XXXX">
<boolean value="1">
<dateTime>1998-06-12T04:32:12+00</dateTime>
</boolean>
</var>
</wddxPacket>
XML;

$array = wddx_deserialize($xml);
var_dump($array);
?>
--EXPECT--
NULL
8 changes: 6 additions & 2 deletions ext/wddx/wddx.c
Expand Up @@ -946,10 +946,10 @@ static void php_wddx_pop_element(void *user_data, const XML_Char *name)
if (!ent1->data) { if (!ent1->data) {
if (stack->top > 1) { if (stack->top > 1) {
stack->top--; stack->top--;
efree(ent1);
} else { } else {
stack->done = 1; stack->done = 1;
} }
efree(ent1);
return; return;
} }


Expand Down Expand Up @@ -988,7 +988,7 @@ static void php_wddx_pop_element(void *user_data, const XML_Char *name)
wddx_stack_top(stack, (void**)&ent2); wddx_stack_top(stack, (void**)&ent2);


/* if non-existent field */ /* if non-existent field */
if (ent2->type == ST_FIELD && ent2->data == NULL) { if (ent2->data == NULL) {
zval_ptr_dtor(&ent1->data); zval_ptr_dtor(&ent1->data);
efree(ent1); efree(ent1);
return; return;
Expand Down Expand Up @@ -1179,9 +1179,13 @@ int php_wddx_deserialize_ex(char *value, int vallen, zval *return_value)


if (stack.top == 1) { if (stack.top == 1) {
wddx_stack_top(&stack, (void**)&ent); wddx_stack_top(&stack, (void**)&ent);
if(ent->data == NULL) {
retval = FAILURE;
} else {
*return_value = *(ent->data); *return_value = *(ent->data);
zval_copy_ctor(return_value); zval_copy_ctor(return_value);
retval = SUCCESS; retval = SUCCESS;
}
} else { } else {
retval = FAILURE; retval = FAILURE;
} }
Expand Down

0 comments on commit a14fdb9

Please sign in to comment.