Page MenuHomePhabricator

Undefined index 0 exception in ExtArrays.php
Closed, ResolvedPublicBUG REPORT

Description

List of steps to reproduce (step by step, including full links if applicable):

  • Install Extension:Arrays and Extension:CirrusSearch
  • Create a page with this content:
{{#arraydefine:s|,t,|,|unique}}

What happens?:

  • CirrusSearch parses the page in the JobQueue and throws an exception

ErrorException from line 155 of /path/to/wiki/extensions/Arrays/ExtArrays.php: PHP Notice: Undefined offset: 0

Which is the following if

				if ( count( $array ) === 1 && $array[0] === '' ) {
					$array = [];
				}

What should have happened instead?:
The page should get parser without exception.

Software version (if not a Wikimedia wiki), browser information, screenshots, other information, etc:

  • MediaWiki 1.35.3
  • Extension:Arrays 2.2.0 (e09d743)
  • Extension:CirrusSearch 6.5.4 (203237e)

Possible fix:
The array_unique() function in the same file

	protected static function array_unique( array $array ) {
		return array_filter( array_unique( $array ), static function ( $value ) {
			return $value !== '';
		} );
	}

uses array_filter() which breaks the assumption that an array with 1 element would have an element with index 0, wrapping it in array_values() should fix this without changing any behavior of the extension.

Full Trace:

ErrorException from line 155 of /path/to/wiki/extensions/Arrays/ExtArrays.php: PHP Notice: Undefined offset: 0
#0 /path/to/wiki/extensions/Arrays/ExtArrays.php(155): MWExceptionHandler::handleError(integer, string, string, integer, array)
#1 /path/to/wiki/includes/parser/Parser.php(3340): ExtArrays::pf_arraydefine(Parser, string, string, string, string)
#2 /path/to/wiki/includes/parser/Parser.php(3047): Parser->callParserFunction(PPFrame_Hash, string, array)
#3 /path/to/wiki/includes/parser/PPFrame_Hash.php(253): Parser->braceSubstitution(array, PPFrame_Hash)
#4 /path/to/wiki/includes/parser/Parser.php(2887): PPFrame_Hash->expand(PPNode_Hash_Tree, integer)
#5 /path/to/wiki/includes/parser/Parser.php(1556): Parser->replaceVariables(string)
#6 /path/to/wiki/includes/parser/Parser.php(651): Parser->internalParse(string)
#7 /path/to/wiki/includes/content/WikitextContent.php(374): Parser->parse(string, Title, ParserOptions, boolean, boolean, integer)
#8 /path/to/wiki/includes/content/AbstractContent.php(590): WikitextContent->fillParserOutput(Title, integer, ParserOptions, boolean, ParserOutput)
#9 /path/to/wiki/includes/Revision/RenderedRevision.php(263): AbstractContent->getParserOutput(Title, integer, ParserOptions, boolean)
#10 /path/to/wiki/includes/Revision/RenderedRevision.php(235): MediaWiki\Revision\RenderedRevision->getSlotParserOutputUncached(WikitextContent, boolean)
#11 /path/to/wiki/includes/Revision/RevisionRenderer.php(215): MediaWiki\Revision\RenderedRevision->getSlotParserOutput(string)
#12 /path/to/wiki/includes/Revision/RevisionRenderer.php(152): MediaWiki\Revision\RevisionRenderer->combineSlotOutput(MediaWiki\Revision\RenderedRevision, array)
#13 [internal function]: MediaWiki\Revision\RevisionRenderer->MediaWiki\Revision\{closure}(MediaWiki\Revision\RenderedRevision, array)
#14 /path/to/wiki/includes/Revision/RenderedRevision.php(197): call_user_func(Closure, MediaWiki\Revision\RenderedRevision, array)
#15 /path/to/wiki/includes/content/ContentHandler.php(1425): MediaWiki\Revision\RenderedRevision->getRevisionParserOutput()
#16 /path/to/wiki/extensions/CirrusSearch/includes/BuildDocument/ParserOutputPageProperties.php(80): ContentHandler->getParserOutputForIndexing(WikiPage, ParserCache)
#17 /path/to/wiki/extensions/CirrusSearch/includes/BuildDocument/ParserOutputPageProperties.php(63): CirrusSearch\BuildDocument\ParserOutputPageProperties->finalizeReal(Elastica\Document, WikiPage, ParserCache, CirrusSearch\CirrusSearch)
#18 /path/to/wiki/extensions/CirrusSearch/includes/BuildDocument/BuildDocument.php(160): CirrusSearch\BuildDocument\ParserOutputPageProperties->finalize(Elastica\Document, Title)
#19 /path/to/wiki/extensions/CirrusSearch/includes/DataSender.php(167): CirrusSearch\BuildDocument\BuildDocument->finalize(Elastica\Document)
#20 /path/to/wiki/extensions/CirrusSearch/includes/Job/ElasticaWrite.php(136): CirrusSearch\DataSender->sendData(string, array)
#21 /path/to/wiki/extensions/CirrusSearch/includes/Job/JobTraits.php(137): CirrusSearch\Job\ElasticaWrite->doJob()
#22 /path/to/wiki/includes/jobqueue/JobRunner.php(372): CirrusSearch\Job\CirrusGenericJob->run()
#23 /path/to/wiki/includes/jobqueue/JobRunner.php(333): JobRunner->doExecuteJob(CirrusSearch\Job\ElasticaWrite)
#24 /path/to/wiki/includes/jobqueue/JobRunner.php(244): JobRunner->executeJob(CirrusSearch\Job\ElasticaWrite)
#25 /path/to/wiki/maintenance/runJobs.php(92): JobRunner->run(array)
#26 /path/to/wiki/maintenance/doMaintenance.php(107): RunJobs->execute()
#27 /path/to/wiki/maintenance/runJobs.php(129): require_once(string)
#28 {main}

Event Timeline

FO-nTTaX updated the task description. (Show Details)
FO-nTTaX updated the task description. (Show Details)

Change 905188 had a related patch set uploaded (by TK-999; author: TK-999):

[mediawiki/extensions/Arrays@master] Avoid PHP Notice for array definitions with an initial separator

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

Change 905188 merged by jenkins-bot:

[mediawiki/extensions/Arrays@master] Avoid PHP Notice for array definitions with an initial separator

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