@@ -353,19 +353,24 @@ static zend_object *xml_parser_create_object(zend_class_entry *class_type) {
353353 return & intern -> std ;
354354}
355355
356- static void xml_parser_free_obj ( zend_object * object )
356+ static void xml_parser_free_ltags ( xml_parser * parser )
357357{
358- xml_parser * parser = xml_parser_from_obj (object );
359-
360- if (parser -> parser ) {
361- XML_ParserFree (parser -> parser );
362- }
363358 if (parser -> ltags ) {
364359 int inx ;
365360 for (inx = 0 ; ((inx < parser -> level ) && (inx < XML_MAXLEVEL )); inx ++ )
366361 efree (parser -> ltags [ inx ]);
367362 efree (parser -> ltags );
368363 }
364+ }
365+
366+ static void xml_parser_free_obj (zend_object * object )
367+ {
368+ xml_parser * parser = xml_parser_from_obj (object );
369+
370+ if (parser -> parser ) {
371+ XML_ParserFree (parser -> parser );
372+ }
373+ xml_parser_free_ltags (parser );
369374 if (!Z_ISUNDEF (parser -> startElementHandler )) {
370375 zval_ptr_dtor (& parser -> startElementHandler );
371376 }
@@ -1282,6 +1287,11 @@ PHP_FUNCTION(xml_parse_into_struct)
12821287
12831288 parser = Z_XMLPARSER_P (pind );
12841289
1290+ if (parser -> isparsing ) {
1291+ php_error_docref (NULL , E_WARNING , "Parser must not be called recursively" );
1292+ RETURN_FALSE ;
1293+ }
1294+
12851295 if (info ) {
12861296 info = zend_try_array_init (info );
12871297 if (!info ) {
@@ -1301,15 +1311,12 @@ PHP_FUNCTION(xml_parse_into_struct)
13011311 }
13021312
13031313 parser -> level = 0 ;
1314+ xml_parser_free_ltags (parser );
13041315 parser -> ltags = safe_emalloc (XML_MAXLEVEL , sizeof (char * ), 0 );
13051316
13061317 XML_SetElementHandler (parser -> parser , _xml_startElementHandler , _xml_endElementHandler );
13071318 XML_SetCharacterDataHandler (parser -> parser , _xml_characterDataHandler );
13081319
1309- if (parser -> isparsing ) {
1310- php_error_docref (NULL , E_WARNING , "Parser must not be called recursively" );
1311- RETURN_FALSE ;
1312- }
13131320 parser -> isparsing = 1 ;
13141321 ret = XML_Parse (parser -> parser , (XML_Char * )data , data_len , 1 );
13151322 parser -> isparsing = 0 ;
0 commit comments