Page MenuHomePhabricator

TypeError: Argument 1 passed to ProofreadPage\Pagination\FilePagination::getPageTitle() must be of the type integer, float given, called in /srv/mediawiki/php-1.37.0-wmf.21/extensions/ProofreadPage/includes/ProofreadPage.php on line 413
Closed, ResolvedPublicPRODUCTION ERROR

Description

Error
normalized_message
[{reqId}] {exception_url}   TypeError: Argument 1 passed to ProofreadPage\Pagination\FilePagination::getPageTitle() must be of the type integer, float given, called in /srv/mediawiki/php-1.37.0-wmf.21/extensions/ProofreadPage/includes/ProofreadPage.php on
exception.trace
from /srv/mediawiki/php-1.37.0-wmf.21/extensions/ProofreadPage/includes/Pagination/FilePagination.php(97)
#0 /srv/mediawiki/php-1.37.0-wmf.21/extensions/ProofreadPage/includes/ProofreadPage.php(413): ProofreadPage\Pagination\FilePagination->getPageTitle(double)
#1 /srv/mediawiki/php-1.37.0-wmf.21/extensions/ProofreadPage/includes/ProofreadPage.php(508): ProofreadPage\ProofreadPage::addPageNsNavigation(Title, SkinVector, array)
#2 /srv/mediawiki/php-1.37.0-wmf.21/includes/HookContainer/HookContainer.php(338): ProofreadPage\ProofreadPage::onSkinTemplateNavigationUniversal(SkinVector, array)
#3 /srv/mediawiki/php-1.37.0-wmf.21/includes/HookContainer/HookContainer.php(137): MediaWiki\HookContainer\HookContainer->callLegacyHook(string, array, array, array)
#4 /srv/mediawiki/php-1.37.0-wmf.21/includes/HookContainer/HookRunner.php(3474): MediaWiki\HookContainer\HookContainer->run(string, array, array)
#5 /srv/mediawiki/php-1.37.0-wmf.21/includes/skins/SkinTemplate.php(1204): MediaWiki\HookContainer\HookRunner->onSkinTemplateNavigation__Universal(SkinVector, array)
#6 /srv/mediawiki/php-1.37.0-wmf.21/skins/Vector/includes/SkinVector.php(295): SkinTemplate->runOnSkinTemplateNavigationHooks(SkinVector, array)
#7 /srv/mediawiki/php-1.37.0-wmf.21/includes/skins/SkinTemplate.php(1531): SkinVector->runOnSkinTemplateNavigationHooks(SkinVector, array)
#8 /srv/mediawiki/php-1.37.0-wmf.21/includes/skins/SkinTemplate.php(826): SkinTemplate->buildContentNavigationUrls()
#9 /srv/mediawiki/php-1.37.0-wmf.21/includes/skins/SkinTemplate.php(294): SkinTemplate->getPortletsTemplateData()
#10 /srv/mediawiki/php-1.37.0-wmf.21/includes/skins/SkinMustache.php(79): SkinTemplate->getTemplateData()
#11 /srv/mediawiki/php-1.37.0-wmf.21/skins/Vector/includes/SkinVector.php(306): SkinMustache->getTemplateData()
#12 /srv/mediawiki/php-1.37.0-wmf.21/includes/skins/SkinMustache.php(56): SkinVector->getTemplateData()
#13 /srv/mediawiki/php-1.37.0-wmf.21/includes/skins/SkinTemplate.php(150): SkinMustache->generateHTML()
#14 /srv/mediawiki/php-1.37.0-wmf.21/includes/OutputPage.php(2644): SkinTemplate->outputPage()
#15 /srv/mediawiki/php-1.37.0-wmf.21/includes/MediaWiki.php(939): OutputPage->output(boolean)
#16 /srv/mediawiki/php-1.37.0-wmf.21/includes/MediaWiki.php(952): MediaWiki::{closure}()
#17 /srv/mediawiki/php-1.37.0-wmf.21/includes/MediaWiki.php(559): MediaWiki->main()
#18 /srv/mediawiki/php-1.37.0-wmf.21/index.php(53): MediaWiki->run()
#19 /srv/mediawiki/php-1.37.0-wmf.21/index.php(46): wfIndexMain()
#20 /srv/mediawiki/w/index.php(3): require(string)
#21 {main}
Impact
Notes

ProofreadPage\Pagination\FilePagination::getPageTitle() enforces $pageNumber to be an integer since e7b6e4cbe4ef4ba824a05a58e2d7fd4865fe2677 which got deployed with 1.37.0-wmf.20.

Other URLs:

Looks like it is simply bad user input. I am guessing the code should catch the wrong page and display a user error.

Details

Request URL
https://te.wikisource.org/wiki/%E0%B0%AA%E0%B1%81%E0%B0%9F:Aandhrapatrika_sanvatsaraadi_sanchika_1910.pdf/16116311245283409348a1147cd1e69dc4ea5e09b4249c1c31

Event Timeline

I'm not sure how this can happen. The code is

$pageNumber = $pagination->getPageNumber( $title );
// ... code that doesn't touch $pageNumber
$nextTitle  = $pagination->getPageTitle( $pageNumber + 1 );

getPageTitle does enforce the argument to be integer, but getPageNumber also enforces its return value to be an integer since the same patch (e7b6e4cbe4ef4ba824a05a58e2d7fd4865fe2677)!

FilePagination
public function getPageNumber( Title $pageTitle ): int {

There's even an explicit int cast on the (only) return line:

if ( $number > 0 ) {
	// Valid page numbers are integer > 0.
	return (int)$number;
}

Oh actually, I just figured it out. Looking at the url, $pageNumber is (int)"16116311245283409348a1147cd1e69dc4ea5e09b4249c1c31". The int cast produces PHP_INT_MAX, and adding 1 results in an integer overflow.

Change 725352 had a related patch set uploaded (by Thiemo Kreuz (WMDE); author: Thiemo Kreuz (WMDE)):

[mediawiki/extensions/ProofreadPage@master] Harden page number calculation to not run into PHP_INT_MAX

https://gerrit.wikimedia.org/r/725352

Change 725438 had a related patch set uploaded (by Inductiveload; author: Thiemo Kreuz (WMDE)):

[mediawiki/extensions/ProofreadPage@master] Harden page number calculation to not run into PHP_INT_MAX

https://gerrit.wikimedia.org/r/725438

Change 725352 merged by jenkins-bot:

[mediawiki/extensions/ProofreadPage@master] Harden page number calculation to not run into PHP_INT_MAX

https://gerrit.wikimedia.org/r/725352

Change 725438 merged by jenkins-bot:

[mediawiki/extensions/ProofreadPage@master] Harden page number calculation to not run into PHP_INT_MAX

https://gerrit.wikimedia.org/r/725438