nlopess         Thu Sep 20 22:30:49 2007 UTC

  Modified files:              
    /php-src/ext/tidy   tidy.c 
    /php-src/ext/tidy/tests     029.phpt 
  Log:
  MFB: fix crash in tidy_get_body() and related functions when the node doesnt 
exist
  
http://cvs.php.net/viewvc.cgi/php-src/ext/tidy/tidy.c?r1=1.113&r2=1.114&diff_format=u
Index: php-src/ext/tidy/tidy.c
diff -u php-src/ext/tidy/tidy.c:1.113 php-src/ext/tidy/tidy.c:1.114
--- php-src/ext/tidy/tidy.c:1.113       Fri May  4 17:45:56 2007
+++ php-src/ext/tidy/tidy.c     Thu Sep 20 22:30:48 2007
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: tidy.c,v 1.113 2007/05/04 17:45:56 nlopess Exp $ */
+/* $Id: tidy.c,v 1.114 2007/09/20 22:30:48 nlopess Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -902,37 +902,42 @@
        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++;
-       newobj->converter = obj->converter;
-       if (obj->converter) obj->converter->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->ptdoc->ref_count++;
+       newobj->converter = obj->converter;
+       if (obj->converter) obj->converter->ref_count++;
+
        tidy_add_default_properties(newobj, is_node TSRMLS_CC);
 }
 
@@ -1056,7 +1061,7 @@
        php_info_print_table_start();
        php_info_print_table_header(2, "Tidy support", "enabled");
        php_info_print_table_row(2, "libTidy Release", (char 
*)tidyReleaseDate());
-       php_info_print_table_row(2, "Extension Version", 
PHP_TIDY_MODULE_VERSION " ($Id: tidy.c,v 1.113 2007/05/04 17:45:56 nlopess Exp 
$)");
+       php_info_print_table_row(2, "Extension Version", 
PHP_TIDY_MODULE_VERSION " ($Id: tidy.c,v 1.114 2007/09/20 22:30:48 nlopess Exp 
$)");
        php_info_print_table_end();
 
        DISPLAY_INI_ENTRIES();
http://cvs.php.net/viewvc.cgi/php-src/ext/tidy/tests/029.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/tidy/tests/029.phpt
diff -u /dev/null php-src/ext/tidy/tests/029.phpt:1.2
--- /dev/null   Thu Sep 20 22:30:49 2007
+++ php-src/ext/tidy/tests/029.phpt     Thu Sep 20 22:30:49 2007
@@ -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

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to