From: daniel Date: Thu, 4 Oct 2018 10:49:50 +0000 (+0200) Subject: Avoid fatal when finding no base revision for a null revision. X-Git-Tag: 1.34.0-rc.0~3888^2 X-Git-Url: http://git.cyclocoop.org/?a=commitdiff_plain;h=539cb2816aecee668c41b418552d75cc6329e0ab;p=lhc%2Fweb%2Fwiklou.git Avoid fatal when finding no base revision for a null revision. Bug: T205675 Change-Id: Iae67649a1be9597086033ad34d9d00556ba35730 --- diff --git a/includes/MovePage.php b/includes/MovePage.php index 2ad315811c..ecd12c6f8e 100644 --- a/includes/MovePage.php +++ b/includes/MovePage.php @@ -536,7 +536,8 @@ class MovePage { # Save a null revision in the page's history notifying of the move $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true, $user ); if ( !is_object( $nullRevision ) ) { - throw new MWException( 'No valid null revision produced in ' . __METHOD__ ); + throw new MWException( 'Failed to create null revision while moving page ID ' + . $oldid . ' to ' . $nt->getPrefixedDBkey() ); } $nullRevId = $nullRevision->insertOn( $dbw ); diff --git a/includes/Revision.php b/includes/Revision.php index a55b1c4d79..e45c6dce0d 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -1179,7 +1179,7 @@ class Revision implements IDBAccessObject { $rec = self::getRevisionStore()->newNullRevision( $dbw, $title, $comment, $minor, $user ); - return new Revision( $rec ); + return $rec ? new Revision( $rec ) : null; } /** diff --git a/includes/Storage/RevisionStore.php b/includes/Storage/RevisionStore.php index bab1b5e38e..d9db8bd2c2 100644 --- a/includes/Storage/RevisionStore.php +++ b/includes/Storage/RevisionStore.php @@ -48,6 +48,7 @@ use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use RecentChange; use Revision; +use RuntimeException; use stdClass; use Title; use User; @@ -1058,13 +1059,15 @@ class RevisionStore ) { $this->checkDatabaseWikiId( $dbw ); + $pageId = $title->getArticleID(); + // T51581: Lock the page table row to ensure no other process // is adding a revision to the page at the same time. // Avoid locking extra tables, compare T191892. $pageLatest = $dbw->selectField( 'page', 'page_latest', - [ 'page_id' => $title->getArticleID() ], + [ 'page_id' => $pageId ], __METHOD__, [ 'FOR UPDATE' ] ); @@ -1081,6 +1084,15 @@ class RevisionStore $title ); + if ( !$oldRevision ) { + $msg = "Failed to load latest revision ID $pageLatest of page ID $pageId."; + $this->logger->error( + $msg, + [ 'exception' => new RuntimeException( $msg ) ] + ); + return null; + } + // Construct the new revision $timestamp = wfTimestampNow(); // TODO: use a callback, so we can override it for testing. $newRevision = MutableRevisionRecord::newFromParentRevision( $oldRevision );