]> granicus.if.org Git - php/commitdiff
fix crash when fetching a node type that doesnt exist
authorNuno Lopes <nlopess@php.net>
Thu, 20 Sep 2007 22:25:06 +0000 (22:25 +0000)
committerNuno Lopes <nlopess@php.net>
Thu, 20 Sep 2007 22:25:06 +0000 (22:25 +0000)
# reported in a manual user note

ext/tidy/tests/029.phpt [new file with mode: 0644]
ext/tidy/tidy.c

diff --git a/ext/tidy/tests/029.phpt b/ext/tidy/tests/029.phpt
new file mode 100644 (file)
index 0000000..1709cd6
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+tidy_get_body() crash
+--SKIPIF--
+<?php if (!extension_loaded('tidy')) die('skip'); ?>
+--FILE--
+<?php
+
+// bug report taken from http://news.php.net/php.notes/130628
+
+$inputs = array(
+       '<frameset > </frameset>',
+       '<html><frameset> </frameset> </html',
+);
+
+
+foreach ($inputs as $input) { 
+
+       $t = tidy_parse_string($input);
+       $t->cleanRepair();
+       var_dump(tidy_get_body($t));
+}
+
+echo "Done\n";
+?>
+--EXPECT--
+NULL
+NULL
+Done
index ffed15523d37d832db37e9302a6d5a476ae6909f..cb2525ce0ead072993d6e6de5be98fe6e05ae190 100644 (file)
@@ -870,35 +870,41 @@ static void *php_tidy_get_opt_val(PHPTidyDoc *ptdoc, TidyOption opt, TidyOptionT
        return NULL;
 }
 
-static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes node)
+static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes node_type)
 {
        PHPTidyObj *newobj;
+       TidyNode node;
        TIDY_FETCH_OBJECT;
 
-       tidy_instanciate(tidy_ce_node, return_value TSRMLS_CC);
-       newobj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC);
-       newobj->type = is_node;
-       newobj->ptdoc = obj->ptdoc;
-       newobj->ptdoc->ref_count++;
-
-       switch(node) {
+       switch (node_type) {
                case is_root_node:
-                       newobj->node = tidyGetRoot(newobj->ptdoc->doc);
+                       node = tidyGetRoot(obj->ptdoc->doc);
                        break;
 
                case is_html_node:
-                       newobj->node = tidyGetHtml(newobj->ptdoc->doc);
+                       node = tidyGetHtml(obj->ptdoc->doc);
                        break;
 
                case is_head_node:
-                       newobj->node = tidyGetHead(newobj->ptdoc->doc);
+                       node = tidyGetHead(obj->ptdoc->doc);
                        break;
 
                case is_body_node:
-                       newobj->node = tidyGetBody(newobj->ptdoc->doc);
+                       node = tidyGetBody(obj->ptdoc->doc);
                        break;
        }
 
+       if (!node) {
+               RETURN_NULL();
+       }
+
+       tidy_instanciate(tidy_ce_node, return_value TSRMLS_CC);
+       newobj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC);
+       newobj->type  = is_node;
+       newobj->ptdoc = obj->ptdoc;
+       newobj->node  = node;
+       newobj->ptdoc->ref_count++;
+
        tidy_add_default_properties(newobj, is_node TSRMLS_CC);
 }