From 766cb52048f01606db9a3b4b5c6eb95ba1e89591 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 11 Feb 2015 12:06:25 +0100 Subject: [PATCH] Clean up state of libxml on failed import. Make sure we always call XMLReader::close() to clean up libxml's internal state, even if import fails with an exception. Otherwise, any subsequent attempt at importing (or otherwise using an XMLReader) will fail with: XMLReader::open(): Unable to open source data This is particularly annoying for unit tests which should be allowed to fail without dragging down subsequent tests. Even more importantly, they may explicitly be testing a failure case, which should not cause subsequent tests to fail. NOTE: Wikibase patch Id035ecebebb67 is blocked on this, please re-check once this is merged. Change-Id: I31c014df39aa11c11ded70050ef12a8e2c5fefc5 --- includes/Import.php | 62 +++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/includes/Import.php b/includes/Import.php index 36028eab92..7eff5da953 100644 --- a/includes/Import.php +++ b/includes/Import.php @@ -497,36 +497,48 @@ class WikiImporter { $keepReading = $this->reader->read(); $skip = false; - while ( $keepReading ) { - $tag = $this->reader->name; - $type = $this->reader->nodeType; - - if ( !Hooks::run( 'ImportHandleToplevelXMLTag', array( $this ) ) ) { - // Do nothing - } elseif ( $tag == 'mediawiki' && $type == XMLReader::END_ELEMENT ) { - break; - } elseif ( $tag == 'siteinfo' ) { - $this->handleSiteInfo(); - } elseif ( $tag == 'page' ) { - $this->handlePage(); - } elseif ( $tag == 'logitem' ) { - $this->handleLogItem(); - } elseif ( $tag != '#text' ) { - $this->warn( "Unhandled top-level XML tag $tag" ); - - $skip = true; - } + $rethrow = null; + try { + while ( $keepReading ) { + $tag = $this->reader->name; + $type = $this->reader->nodeType; + + if ( !Hooks::run( 'ImportHandleToplevelXMLTag', array( $this ) ) ) { + // Do nothing + } elseif ( $tag == 'mediawiki' && $type == XMLReader::END_ELEMENT ) { + break; + } elseif ( $tag == 'siteinfo' ) { + $this->handleSiteInfo(); + } elseif ( $tag == 'page' ) { + $this->handlePage(); + } elseif ( $tag == 'logitem' ) { + $this->handleLogItem(); + } elseif ( $tag != '#text' ) { + $this->warn( "Unhandled top-level XML tag $tag" ); + + $skip = true; + } - if ( $skip ) { - $keepReading = $this->reader->next(); - $skip = false; - $this->debug( "Skip" ); - } else { - $keepReading = $this->reader->read(); + if ( $skip ) { + $keepReading = $this->reader->next(); + $skip = false; + $this->debug( "Skip" ); + } else { + $keepReading = $this->reader->read(); + } } + } catch ( Exception $ex ) { + $rethrow = $ex; } + // finally libxml_disable_entity_loader( $oldDisable ); + $this->reader->close(); + + if ( $rethrow ) { + throw $rethrow; + } + return true; } -- 2.20.1