[stacktrace] #0 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/language/ConverterRule.php(163): MWExceptionHandler::handleError() #1 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/language/ConverterRule.php(390): ConverterRule->parseRules() #2 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/language/LanguageConverter.php(961): ConverterRule->parse() #3 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/language/LanguageConverter.php(894): LanguageConverter->recursiveConvertRule() #4 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/language/LanguageConverter.php(843): LanguageConverter->recursiveConvertTopLevel() #5 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/language/LanguageConverter.php(824): LanguageConverter->convertTo() #6 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/parser/Parser.php(1691): LanguageConverter->convert() #7 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/parser/Parser.php(693): Parser->internalParseHalfParsed() #8 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/content/WikitextContentHandler.php(294): Parser->parse() #9 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/content/ContentHandler.php(1721): WikitextContentHandler->fillParserOutput() #10 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/content/Renderer/ContentRenderer.php(47): ContentHandler->getParserOutput() #11 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/Revision/RenderedRevision.php(267): MediaWiki\\Content\\Renderer\\ContentRenderer->getParserOutput() #12 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/Revision/RenderedRevision.php(238): MediaWiki\\Revision\\RenderedRevision->getSlotParserOutputUncached() #13 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/Revision/RevisionRenderer.php(221): MediaWiki\\Revision\\RenderedRevision->getSlotParserOutput() #14 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/Revision/RevisionRenderer.php(158): MediaWiki\\Revision\\RevisionRenderer->combineSlotOutput() #15 [internal function]: MediaWiki\\Revision\\RevisionRenderer->MediaWiki\\Revision\\{closure}() #16 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/Revision/RenderedRevision.php(200): call_user_func() #17 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/poolcounter/PoolWorkArticleView.php(137): MediaWiki\\Revision\\RenderedRevision->getRevisionParserOutput() #18 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/poolcounter/PoolCounterWork.php(162): PoolWorkArticleView->doWork() #19 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/page/ParserOutputAccess.php(279): PoolCounterWork->execute() #20 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/page/Article.php(702): MediaWiki\\Page\\ParserOutputAccess->getParserOutput() #21 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/page/Article.php(517): Article->generateContentOutput() #22 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/actions/ViewAction.php(80): Article->view() #23 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/MediaWiki.php(543): ViewAction->show() #24 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/MediaWiki.php(320): MediaWiki->performAction() #25 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/MediaWiki.php(903): MediaWiki->performRequest() #26 /srv/mediawiki/tags/2022-01-19_11:47:57/includes/MediaWiki.php(563): MediaWiki->main() #27 /srv/mediawiki/tags/2022-01-19_11:47:57/index.php(53): MediaWiki->run() #28 /srv/mediawiki/tags/2022-01-19_11:47:57/index.php(46): wfIndexMain() #29 {main}
Description
Details
Status | Subtype | Assigned | Task | ||
---|---|---|---|---|---|
Resolved | PRODUCTION ERROR | Func | T353470 ConverterRule: PHP Warning: Invalid argument supplied for foreach() | ||
Resolved | Func | T299757 PHP Warning: Invalid argument supplied for foreach() at includes/language/ConverterRule.php:163 |
Event Timeline
$varsep_pattern = "/;\s*(?=zh\s*:|[^;]*?=>\s*zh\s*:|zh-hans\s*:|[^;]*?=>\s*zh-hans\s*:|zh-Hans\s*:|[^;]*?=>\s*zh-Hans\s*:|zh-hant\s*:|[^;]*?=>\s*zh-hant\s*:|zh-Hant\s*:|[^;]*?=>\s*zh-Hant\s*:|zh-cn\s*:|[^;]*?=>\s*zh-cn\s*:|zh-Hans-CN\s*:|[^;]*?=>\s*zh-Hans-CN\s*:|zh-hk\s*:|[^;]*?=>\s*zh-hk\s*:|zh-Hant-HK\s*:|[^;]*?=>\s*zh-Hant-HK\s*:|zh-mo\s*:|[^;]*?=>\s*zh-mo\s*:|zh-Hant-MO\s*:|[^;]*?=>\s*zh-Hant-MO\s*:|zh-my\s*:|[^;]*?=>\s*zh-my\s*:|zh-Hans-MY\s*:|[^;]*?=>\s*zh-Hans-MY\s*:|zh-sg\s*:|[^;]*?=>\s*zh-sg\s*:|zh-Hans-SG\s*:|[^;]*?=>\s*zh-Hans-SG\s*:|zh-tw\s*:|[^;]*?=>\s*zh-tw\s*:|zh-Hant-TW\s*:|[^;]*?=>\s*zh-Hant-TW\s*:|\s*$)/"
preg_split( $varsep_pattern, $rules ); fails with PREG_BACKTRACK_LIMIT_ERROR.
Any regexp gurus who could see if the regexp could be improved to reduce the amount of backtracking?
Change 773911 had a related patch set uploaded (by Func; author: Func):
[mediawiki/core@master] LanguageConverter: Improve regex pattern for conversion rules parsing
Temporarily assigning to myself (so that I don't forget) to see if I can confirm the proposed fix.
I am currently unable to reproduce this issue. I added some debug logging to print the input, but there is nothing in the logs. I will drop our workaround to see if the issue resurfaces.
I can reproduce it in eval.php:
> $s = MediaWiki\MediaWikiServices::getInstance(); > $lcf = $s->getLanguageConverterFactory(); > $lf = $s->getLanguageFactory(); > $conv = $lcf->getLanguageConverter($lf->getLanguage('zh')); > ini_set('pcre.backtrack_limit',100000); > (new ConverterRule(';'.str_repeat('=>',1000),$conv))->parse(); > (new ConverterRule(';'.str_repeat('=>',2000),$conv))->parse(); Warning: foreach() argument must be of type array|object, string given in /srv/mw/core/includes/language/ConverterRule.php on line 163
Applying the proposed patch, it fails at around 34,000 separators instead of 2,000, with a backtrack_limit of 100,000. Note that a limit of 100,000 is much lower than what I recommend for production.
Change 773911 had a related patch set uploaded (by Func; author: Func):
[mediawiki/core@master] LanguageConverter: Improve regex pattern for conversion rules parsing
Change 989743 had a related patch set uploaded (by Tim Starling; author: Tim Starling):
[mediawiki/core@master] In ConverterRule:::parseRules log and ignore preg_split() failure
Change 773911 merged by jenkins-bot:
[mediawiki/core@master] LanguageConverter: Improve regex pattern for conversion rules parsing
Change 989743 merged by jenkins-bot:
[mediawiki/core@master] In ConverterRule:::parseRules log and ignore preg_split() failure