MFH: Fix bug #32245 (xml_parser_free() in function assigned to the xml parser
authorRob Richards <rrichards@php.net>
Thu, 28 Apr 2005 12:19:38 +0000 (12:19 +0000)
committerRob Richards <rrichards@php.net>
Thu, 28 Apr 2005 12:19:38 +0000 (12:19 +0000)
  gives a segfault)

ext/xml/php_xml.h
ext/xml/xml.c

index b1232c2c0bdcff38e0842c08db6c632855a14248..700317acaa3ee18f6dddd5c21b573ad89b2fc959 100644 (file)
@@ -79,6 +79,7 @@ typedef struct {
        char **ltags;
        int lastwasopen;
        int skipwhite;
+       int isparsing;
        
        XML_Char *baseURI;
 } xml_parser;
index fce98f0cc24c98f00f14e5dd82c26f4d4a7bff1c..6985450ed63c6ea87c0175b6cd3a3afa2c020c9a 100644 (file)
@@ -1044,6 +1044,8 @@ PHP_FUNCTION(xml_parser_create)
        parser->target_encoding = encoding;
        parser->case_folding = 1;
        parser->object = NULL;
+       parser->isparsing = 0;
+
        XML_SetUserData(parser->parser, parser);
 
        ZEND_REGISTER_RESOURCE(return_value,parser,le_xml_parser);
@@ -1337,7 +1339,9 @@ PHP_FUNCTION(xml_parse)
                isFinal = 0;
        }
 
+       parser->isparsing = 1;
        ret = XML_Parse(parser->parser, Z_STRVAL_PP(data), Z_STRLEN_PP(data), isFinal);
+       parser->isparsing = 0;
        RETVAL_LONG(ret);
 }
 
@@ -1376,7 +1380,9 @@ PHP_FUNCTION(xml_parse_into_struct)
        XML_SetElementHandler(parser->parser, _xml_startElementHandler, _xml_endElementHandler);
        XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler);
 
+       parser->isparsing = 1;
        ret = XML_Parse(parser->parser, Z_STRVAL_PP(data), Z_STRLEN_PP(data), 1);
+       parser->isparsing = 0;
 
        RETVAL_LONG(ret);
 }
@@ -1477,6 +1483,11 @@ PHP_FUNCTION(xml_parser_free)
 
        ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser);
 
+       if (parser->isparsing == 1) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parser cannot be freed while it is parsing.");
+               RETURN_FALSE;
+       }
+
        if (zend_list_delete(parser->index) == FAILURE) {
                RETURN_FALSE;
        }