Page MenuHomePhabricator

PHP Warning: Invalid argument supplied for foreach() at includes/language/ConverterRule.php:163
Closed, ResolvedPublic

Description

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

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

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

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.

Nikerabbit claimed this task.

Haven't seen in a while. Assuming resolved by itself.

tstarling subscribed.

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

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

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

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

Change 773911 merged by jenkins-bot:

[mediawiki/core@master] LanguageConverter: Improve regex pattern for conversion rules parsing

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

Change 989743 merged by jenkins-bot:

[mediawiki/core@master] In ConverterRule:::parseRules log and ignore preg_split() failure

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

Func claimed this task.
Func removed a project: Patch-For-Review.