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:
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}