Page MenuHomePhabricator

PHP Warning: Only arrays and Traversables can be unpacked
Closed, ResolvedPublicPRODUCTION ERROR

Description

Error
labels.normalized_message
[{reqId}] {exception_url}   PHP Warning: Only arrays and Traversables can be unpacked
error.stack_trace
from /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/Services/UploadBase/ValidatingUploadBase.php(101)
#0 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/Services/UploadBase/ValidatingUploadBase.php(101): MWExceptionHandler::handleError(integer, string, string, integer, array)
#1 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/Operations/FileRevisionFromRemoteUrl.php(171): FileImporter\Services\UploadBase\ValidatingUploadBase->validateUpload(User, FileImporter\Data\TextRevision)
#2 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/Data/ImportOperations.php(113): FileImporter\Operations\FileRevisionFromRemoteUrl->validate()
#3 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/Data/ImportOperations.php(77): FileImporter\Data\ImportOperations::FileImporter\Data\{closure}(FileImporter\Operations\FileRevisionFromRemoteUrl)
#4 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/Data/ImportOperations.php(114): FileImporter\Data\ImportOperations->runOperations(integer, integer, boolean, Closure)
#5 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/Services/Importer.php(152): FileImporter\Data\ImportOperations->validate()
#6 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/SpecialImportFile.php(366): FileImporter\Services\Importer->import(User, FileImporter\Data\ImportPlan)
#7 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/SpecialImportFile.php(267): FileImporter\SpecialImportFile->doImport(FileImporter\Data\ImportPlan)
#8 /srv/mediawiki/php-1.41.0-wmf.4/extensions/FileImporter/src/SpecialImportFile.php(233): FileImporter\SpecialImportFile->handleAction(string, FileImporter\Data\ImportPlan)
#9 /srv/mediawiki/php-1.41.0-wmf.4/includes/specialpage/SpecialPage.php(701): FileImporter\SpecialImportFile->execute(NULL)
#10 /srv/mediawiki/php-1.41.0-wmf.4/includes/specialpage/SpecialPageFactory.php(1497): SpecialPage->run(NULL)
#11 /srv/mediawiki/php-1.41.0-wmf.4/includes/MediaWiki.php(328): MediaWiki\SpecialPage\SpecialPageFactory->executePath(string, RequestContext)
#12 /srv/mediawiki/php-1.41.0-wmf.4/includes/MediaWiki.php(926): MediaWiki->performRequest()
#13 /srv/mediawiki/php-1.41.0-wmf.4/includes/MediaWiki.php(579): MediaWiki->main()
#14 /srv/mediawiki/php-1.41.0-wmf.4/index.php(50): MediaWiki->run()
#15 /srv/mediawiki/php-1.41.0-wmf.4/index.php(46): wfIndexMain()
#16 /srv/mediawiki/w/index.php(3): require(string)
#17 {main}
Notes
  • Low volume error (probably because it's rarely used)
  • Only on commons
  • Happening since at least 1.41.0-wmf.1

Details

Request URL
https://commons.wikimedia.org/wiki/Special:ImportFile

Event Timeline

Tagging AbuseFilter since I think that’s where the unspreadable error comes from:

FileImporter ValidatingUploadBase::validateUpload()
		$error = null;
		if ( !$textRevision ) {
			Hooks::run( 'UploadStashFile', [
				$this,
				$user,
				$this->mFileProps,
				&$error
			] );
		} else {
			Hooks::run( 'UploadVerifyUpload', [
				$this,
				$user,
				$this->mFileProps,
				$textRevision->getField( 'comment' ),
				$textRevision->getField( '*' ),
				&$error
			] );
		}
		// @phan-suppress-next-line PhanImpossibleCondition May set by hook
		if ( $error ) {
			// @phan-suppress-next-line PhanParamTooFewUnpack
			return StatusValue::newFatal( ...$error );
		}
AbuseFilter FilteredActionsHandler::filterUpload()
		if ( !$filterResult->isOK() ) {
			// Produce a useful error message for API edits
			$filterResultApi = self::getApiStatus( $filterResult );
			// @todo Return all errors instead of only the first one
			$error = $filterResultApi->getErrors()[0]['message'];
		}

(And untagging Wikidata Campsite – the tag is generally not used anymore AFAIK, but also I don’t think this is related to Wikidata – Move-Files-To-Commons was a different team at WMDE.)

Umherirrender subscribed.

Both hooks UploadStashFile and UploadVerifyUpload document the $error as array|MessageSpecifier|null, so a general unpack in FileImporter seems not right.
But StatusValue::newFatal is also documented to take MessageSpecifier, core is casting to array if non-array is given

Change 908594 had a related patch set uploaded (by Umherirrender; author: Umherirrender):

[mediawiki/extensions/FileImporter@master] Fix error handling for upload hooks setting MessageSpecifier as error

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

Change 908594 merged by jenkins-bot:

[mediawiki/extensions/FileImporter@master] Fix error handling for upload hooks setting MessageSpecifier as error

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

The hook caller and the hook handler exists since many versions, so I would not say this needs a backport.