@@ -353,19 +353,24 @@ static zend_object *xml_parser_create_object(zend_class_entry *class_type) {
353
353
return & intern -> std ;
354
354
}
355
355
356
- static void xml_parser_free_obj ( zend_object * object )
356
+ static void xml_parser_free_ltags ( xml_parser * parser )
357
357
{
358
- xml_parser * parser = xml_parser_from_obj (object );
359
-
360
- if (parser -> parser ) {
361
- XML_ParserFree (parser -> parser );
362
- }
363
358
if (parser -> ltags ) {
364
359
int inx ;
365
360
for (inx = 0 ; ((inx < parser -> level ) && (inx < XML_MAXLEVEL )); inx ++ )
366
361
efree (parser -> ltags [ inx ]);
367
362
efree (parser -> ltags );
368
363
}
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 );
369
374
if (!Z_ISUNDEF (parser -> startElementHandler )) {
370
375
zval_ptr_dtor (& parser -> startElementHandler );
371
376
}
@@ -1282,6 +1287,11 @@ PHP_FUNCTION(xml_parse_into_struct)
1282
1287
1283
1288
parser = Z_XMLPARSER_P (pind );
1284
1289
1290
+ if (parser -> isparsing ) {
1291
+ php_error_docref (NULL , E_WARNING , "Parser must not be called recursively" );
1292
+ RETURN_FALSE ;
1293
+ }
1294
+
1285
1295
if (info ) {
1286
1296
info = zend_try_array_init (info );
1287
1297
if (!info ) {
@@ -1301,15 +1311,12 @@ PHP_FUNCTION(xml_parse_into_struct)
1301
1311
}
1302
1312
1303
1313
parser -> level = 0 ;
1314
+ xml_parser_free_ltags (parser );
1304
1315
parser -> ltags = safe_emalloc (XML_MAXLEVEL , sizeof (char * ), 0 );
1305
1316
1306
1317
XML_SetElementHandler (parser -> parser , _xml_startElementHandler , _xml_endElementHandler );
1307
1318
XML_SetCharacterDataHandler (parser -> parser , _xml_characterDataHandler );
1308
1319
1309
- if (parser -> isparsing ) {
1310
- php_error_docref (NULL , E_WARNING , "Parser must not be called recursively" );
1311
- RETURN_FALSE ;
1312
- }
1313
1320
parser -> isparsing = 1 ;
1314
1321
ret = XML_Parse (parser -> parser , (XML_Char * )data , data_len , 1 );
1315
1322
parser -> isparsing = 0 ;
0 commit comments