Daniel Kinzler has uploaded a new change for review.
https://gerrit.wikimedia.org/r/189925
Change subject: Clean up state of libxml on failed import.
......................................................................
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.
Change-Id: I31c014df39aa11c11ded70050ef12a8e2c5fefc5
---
M includes/Import.php
1 file changed, 36 insertions(+), 24 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/25/189925/1
diff --git a/includes/Import.php b/includes/Import.php
index 36028ea..7eff5da 100644
--- a/includes/Import.php
+++ b/includes/Import.php
@@ -497,36 +497,48 @@
$keepReading = $this->reader->read();
$skip = false;
- while ( $keepReading ) {
- $tag = $this->reader->name;
- $type = $this->reader->nodeType;
+ $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"
);
+ 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;
+ $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;
}
--
To view, visit https://gerrit.wikimedia.org/r/189925
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I31c014df39aa11c11ded70050ef12a8e2c5fefc5
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Daniel Kinzler <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits