Page MenuHomePhabricator

MW 1.41 parser locked error when using languages with grammatical gender
Open, Needs TriagePublicBUG REPORT

Description

Steps to replicate the issue:

  • Installed MediaWiki 1.41.1 on a server.
  • Vector skin, MySQL database.
  • Installation language: ES.
  • Make sure the installation works OK.
  • Install Auth_remoteuser (for release 1.41).

What happens?:

Installation crashes. You can see top bar (with correct logged user) and left sidebar. But content area shows internal error (stack trace included later).

Further steps:

  • Removing the extension, installation works fine.
  • Instead, changing language to EN causes installation to work perfectly.
  • Returning to ES it crashes again.

Some languages tried:

  • ES and FR crash.
  • EN, IT, RU work fine.

All the tried languages work fine if the extension is removed.

Software version:

MediaWiki 1.41.1.

Other information:

See stack trace following:

/wiki/Pagina_principal MWException: Parser state cleared while parsing.
Did you call Parser::parse recursively? Lock is held by:
#0 /aplicaciones/dp08/dp08_bcnwiki/includes/parser/Parser.php(882): Parser->lock()
#1 /aplicaciones/dp08/dp08_bcnwiki/includes/parser/Parser.php(4821): Parser->preprocess()
#2 /aplicaciones/dp08/dp08_bcnwiki/includes/language/MessageCache.php(1442): Parser->transformMsg()
#3 /aplicaciones/dp08/dp08_bcnwiki/includes/language/Message.php(1464): MessageCache->transform()
#4 /aplicaciones/dp08/dp08_bcnwiki/includes/language/Message.php(1011): Message->transformText()
#5 /aplicaciones/dp08/dp08_bcnwiki/includes/language/Message.php(1059): Message->format()
#6 /aplicaciones/dp08/dp08_bcnwiki/includes/linker/Linker.php(2207): Message->text()
#7 /aplicaciones/dp08/dp08_bcnwiki/includes/linker/Linker.php(2388): MediaWiki\Linker\Linker::titleAttrib()
#8 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentLink.php(236): MediaWiki\Linker\Linker::tooltipAndAccesskeyAttribs()
#9 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentLink.php(183): MediaWiki\Skin\SkinComponentLink->applyLinkTitleAttribs()
#10 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentLink.php(254): MediaWiki\Skin\SkinComponentLink->makeLink()
#11 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentListItem.php(138): MediaWiki\Skin\SkinComponentLink->getTemplateData()
#12 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentListItem.php(221): MediaWiki\Skin\SkinComponentListItem->makeListItem()
#13 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentMenu.php(166): MediaWiki\Skin\SkinComponentListItem->getTemplateData()
#14 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/Skin.php(2470): MediaWiki\Skin\SkinComponentMenu->getTemplateData()
#15 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinTemplate.php(641): Skin->getPortletData()
#16 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinTemplate.php(181): SkinTemplate->getPortletsTemplateData()
#17 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinMustache.php(125): SkinTemplate->getTemplateData()
#18 /aplicaciones/dp08/dp08_bcnwiki/skins/Vector/includes/SkinVectorLegacy.php(161): SkinMustache->getTemplateData()
#19 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinMustache.php(92): MediaWiki\Skins\Vector\SkinVectorLegacy->getTemplateData()
#20 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinTemplate.php(174): SkinMustache->generateHTML()
#21 /aplicaciones/dp08/dp08_bcnwiki/includes/Output/OutputPage.php(2947): SkinTemplate->outputPage()
#22 /aplicaciones/dp08/dp08_bcnwiki/includes/MediaWiki.php(978): MediaWiki\Output\OutputPage->output()
#23 /aplicaciones/dp08/dp08_bcnwiki/includes/MediaWiki.php(613): MediaWiki->main()
#24 /aplicaciones/dp08/dp08_bcnwiki/index.php(50): MediaWiki->run()
#25 /aplicaciones/dp08/dp08_bcnwiki/index.php(46): wfIndexMain()
#26 {main}

Backtrace:

from /aplicaciones/dp08/dp08_bcnwiki/includes/parser/Parser.php(6309)
#0 /aplicaciones/dp08/dp08_bcnwiki/includes/parser/Parser.php(882): Parser->lock()
#1 /aplicaciones/dp08/dp08_bcnwiki/includes/parser/Parser.php(4821): Parser->preprocess()
#2 /aplicaciones/dp08/dp08_bcnwiki/includes/language/MessageCache.php(1442): Parser->transformMsg()
#3 /aplicaciones/dp08/dp08_bcnwiki/includes/language/Message.php(1464): MessageCache->transform()
#4 /aplicaciones/dp08/dp08_bcnwiki/includes/language/Message.php(1011): Message->transformText()
#5 /aplicaciones/dp08/dp08_bcnwiki/includes/language/Message.php(1059): Message->format()
#6 /aplicaciones/dp08/dp08_bcnwiki/includes/linker/Linker.php(2207): Message->text()
#7 /aplicaciones/dp08/dp08_bcnwiki/includes/linker/Linker.php(2388): MediaWiki\Linker\Linker::titleAttrib()
#8 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentLink.php(236): MediaWiki\Linker\Linker::tooltipAndAccesskeyAttribs()
#9 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentLink.php(183): MediaWiki\Skin\SkinComponentLink->applyLinkTitleAttribs()
#10 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentLink.php(254): MediaWiki\Skin\SkinComponentLink->makeLink()
#11 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentListItem.php(138): MediaWiki\Skin\SkinComponentLink->getTemplateData()
#12 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentListItem.php(221): MediaWiki\Skin\SkinComponentListItem->makeListItem()
#13 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/components/SkinComponentMenu.php(166): MediaWiki\Skin\SkinComponentListItem->getTemplateData()
#14 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/Skin.php(2470): MediaWiki\Skin\SkinComponentMenu->getTemplateData()
#15 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinTemplate.php(641): Skin->getPortletData()
#16 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinTemplate.php(181): SkinTemplate->getPortletsTemplateData()
#17 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinMustache.php(125): SkinTemplate->getTemplateData()
#18 /aplicaciones/dp08/dp08_bcnwiki/skins/Vector/includes/SkinVectorLegacy.php(161): SkinMustache->getTemplateData()
#19 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinMustache.php(92): MediaWiki\Skins\Vector\SkinVectorLegacy->getTemplateData()
#20 /aplicaciones/dp08/dp08_bcnwiki/includes/skins/SkinTemplate.php(174): SkinMustache->generateHTML()
#21 /aplicaciones/dp08/dp08_bcnwiki/includes/Output/OutputPage.php(2947): SkinTemplate->outputPage()
#22 /aplicaciones/dp08/dp08_bcnwiki/includes/MediaWiki.php(978): MediaWiki\Output\OutputPage->output()
#23 /aplicaciones/dp08/dp08_bcnwiki/includes/MediaWiki.php(613): MediaWiki->main()
#24 /aplicaciones/dp08/dp08_bcnwiki/index.php(50): MediaWiki->run()
#25 /aplicaciones/dp08/dp08_bcnwiki/index.php(46): wfIndexMain()
#26 {main}

Support desk links:

Event Timeline

It would be nice to know which exact translated message creates this problem but not sure how to do that - maybe a question for https://www.mediawiki.org/wiki/Project:Support_desk

This is not an issue to fix in any code of the extension itself as there is not a single call in the extension codebase itself listed.

I have just reported it in Support desk also.

There is only 1 translation message and it's pretty similar to the English translation, so I doubt that is it.

The only thing that really stands out, is that this extension does a somewhat unconventional method of registering and running of several hooks. It does this straight from the session provider, directly going to the hook container and registration static anonymous functions. Kinda difficult to determine if that is safe or not..

There are several other similar reports on Project:Support_desk, most of them saying it happens with no extensions just core mediawiki. All of them saying they are using MW 1.41.1

It would be nice to know which exact translated message creates this problem but not sure how to do that

One of the posts on support desk seem to indicate that the message is tooltip-pt-userpage

ES and FR crash.
EN, IT, RU work fine.

It should be noted that ES and FR have gender differences for the tooltip-pt-userpage, where EN, IT, and RU use the same text regardless of user gender.

The logic has a short cut for the case where there is only one gender form like EN, IT and RU, so the issue is somewhere in the gender code probably.


When parsing {{GENDER:...}} in a message where there is more than one argument to {{GENDER:..}}, eventually this will call GenderCache::getGenderOf which will call RequestContext::getMain()->getUser()->getName() which will call User::newFromSession (maybe). Eventually this will call SessionHandler stuff.

So plausible theory is that auth_remoteuser tries to parse something via SessionHandler code, causing problems.

However, MessageCache::transform & MessageCache::parse() has a check for $this->inParser() which is supposed to prevent that 🤷.

Another possibility, is thatMessageCache::getParserOptions() triggers RequestContext::getMain()->getUser(), which somehow triggers another message parse. Since all this happens before $this->isInParse is set, the MessageCache guard code wouldn't trigger.

Also, for reference, i tried to reproduce this, by installing 1.41.1 tarball, and doing wfLoadExtension( 'Auth_remoteuser' );$wgAuthRemoteuserUserName = "Everybody";, but i wasn't able to reproduce.

Given some people on support desk are also reporting this even with no extensions, i think there is still some sort of factor missing that triggers this issue.

Bawolff renamed this task from Extension crashes with certain languages to MW 1.41 parser locked error when using languages with grammatical gender.Jun 10 2024, 6:51 PM
Bawolff added a project: MW-1.41-release.

I've just started all over again, but this time using the MediaWiki LTS version (1.39.7).

The problem is exactly the same.

Maybe it depends on the configured cache layers ? SQL vs file vs memcached.

If people can share what cache settings they have in their LocalSettings.php, that could provide a hint ?

When I had no cache at all it crashed. After adding Main cache, it crashed also.

Unfortunately I'm seeing this issue in one of my 1.41 and 1.43 development sandboxes. Both are running on the same NixOS-based host inside a single Ubuntu 24.04-based Docker container running PHP 8.1.31 (Ondrej's PPA - https://launchpad.net/~ondrej/+archive/ubuntu/php) and NGINX. Doesn't matter whether Opcache or JIT are enabled. It also doesn't matter whether any extensions or skins are installed - as in, I can reproduce the problem on the install without any extensions or skins, as long as I'm logged in and the interface language (prefs or uselang) is set to a language with grammatical gender (tried es, fr, pl, all exhibiting the same issue). This happens regardless of MW's cache settings or the DB used.

[68ff7208fbebc2b99576ed5c] /wiki/Commons_Wiki LogicException: Parser state cleared while parsing. Did you call Parser::parse recursively? Lock is held by: #0 /var/www/wiki/mw-1.43/includes/parser/Parser.php(931): MediaWiki\Parser\Parser->lock()
#1 /var/www/wiki/mw-1.43/includes/parser/Parser.php(4936): MediaWiki\Parser\Parser->preprocess()
#2 /var/www/wiki/mw-1.43/includes/language/MessageCache.php(1476): MediaWiki\Parser\Parser->transformMsg()
#3 /var/www/wiki/mw-1.43/includes/Message/Message.php(1535): MessageCache->transform()
#4 /var/www/wiki/mw-1.43/includes/Message/Message.php(1077): MediaWiki\Message\Message->transformText()
#5 /var/www/wiki/mw-1.43/includes/Message/Message.php(1125): MediaWiki\Message\Message->format()
#6 /var/www/wiki/mw-1.43/includes/linker/Linker.php(1944): MediaWiki\Message\Message->text()
#7 /var/www/wiki/mw-1.43/includes/linker/Linker.php(2126): MediaWiki\Linker\Linker::titleAttrib()
#8 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentLink.php(251): MediaWiki\Linker\Linker::tooltipAndAccesskeyAttribs()
#9 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentLink.php(188): MediaWiki\Skin\SkinComponentLink->applyLinkTitleAttribs()
#10 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentLink.php(266): MediaWiki\Skin\SkinComponentLink->makeLink()
#11 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentListItem.php(170): MediaWiki\Skin\SkinComponentLink->getTemplateData()
#12 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentListItem.php(221): MediaWiki\Skin\SkinComponentListItem->makeListItem()
#13 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentMenu.php(166): MediaWiki\Skin\SkinComponentListItem->getTemplateData()
#14 /var/www/wiki/mw-1.43/includes/skins/Skin.php(2511): MediaWiki\Skin\SkinComponentMenu->getTemplateData()
#15 /var/www/wiki/mw-1.43/includes/skins/SkinTemplate.php(643): Skin->getPortletData()
#16 /var/www/wiki/mw-1.43/includes/skins/SkinTemplate.php(187): SkinTemplate->getPortletsTemplateData()
#17 /var/www/wiki/mw-1.43/includes/skins/SkinMustache.php(131): SkinTemplate->getTemplateData()
#18 /var/www/wiki/mw-1.43/includes/skins/SkinFallback.php(121): SkinMustache->getTemplateData()
#19 /var/www/wiki/mw-1.43/includes/skins/SkinMustache.php(93): SkinFallback->getTemplateData()
#20 /var/www/wiki/mw-1.43/includes/skins/SkinTemplate.php(180): SkinMustache->generateHTML()
#21 /var/www/wiki/mw-1.43/includes/skins/Skin.php(683): SkinTemplate->outputPage()
#22 /var/www/wiki/mw-1.43/includes/Output/OutputPage.php(3193): Skin->outputPageFinal()
#23 /var/www/wiki/mw-1.43/includes/actions/ActionEntryPoint.php(163): MediaWiki\Output\OutputPage->output()
#24 /var/www/wiki/mw-1.43/includes/MediaWikiEntryPoint.php(200): MediaWiki\Actions\ActionEntryPoint->execute()
#25 /var/www/wiki/mw-1.43/index.php(58): MediaWiki\MediaWikiEntryPoint->run()
#26 /var/www/wiki/index.php(3): require('/var/www/wiki/m...')
#27 {main}

Backtrace:

from /var/www/wiki/mw-1.43/includes/parser/Parser.php(6413)
#0 /var/www/wiki/mw-1.43/includes/parser/Parser.php(931): MediaWiki\Parser\Parser->lock()
#1 /var/www/wiki/mw-1.43/includes/parser/Parser.php(4936): MediaWiki\Parser\Parser->preprocess()
#2 /var/www/wiki/mw-1.43/includes/language/MessageCache.php(1476): MediaWiki\Parser\Parser->transformMsg()
#3 /var/www/wiki/mw-1.43/includes/Message/Message.php(1535): MessageCache->transform()
#4 /var/www/wiki/mw-1.43/includes/Message/Message.php(1077): MediaWiki\Message\Message->transformText()
#5 /var/www/wiki/mw-1.43/includes/Message/Message.php(1125): MediaWiki\Message\Message->format()
#6 /var/www/wiki/mw-1.43/includes/linker/Linker.php(1944): MediaWiki\Message\Message->text()
#7 /var/www/wiki/mw-1.43/includes/linker/Linker.php(2126): MediaWiki\Linker\Linker::titleAttrib()
#8 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentLink.php(251): MediaWiki\Linker\Linker::tooltipAndAccesskeyAttribs()
#9 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentLink.php(188): MediaWiki\Skin\SkinComponentLink->applyLinkTitleAttribs()
#10 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentLink.php(266): MediaWiki\Skin\SkinComponentLink->makeLink()
#11 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentListItem.php(138): MediaWiki\Skin\SkinComponentLink->getTemplateData()
#12 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentListItem.php(221): MediaWiki\Skin\SkinComponentListItem->makeListItem()
#13 /var/www/wiki/mw-1.43/includes/skins/components/SkinComponentMenu.php(166): MediaWiki\Skin\SkinComponentListItem->getTemplateData()
#14 /var/www/wiki/mw-1.43/includes/skins/Skin.php(2511): MediaWiki\Skin\SkinComponentMenu->getTemplateData()
#15 /var/www/wiki/mw-1.43/includes/skins/SkinTemplate.php(643): Skin->getPortletData()
#16 /var/www/wiki/mw-1.43/includes/skins/SkinTemplate.php(187): SkinTemplate->getPortletsTemplateData()
#17 /var/www/wiki/mw-1.43/includes/skins/SkinMustache.php(131): SkinTemplate->getTemplateData()
#18 /var/www/wiki/mw-1.43/includes/skins/SkinFallback.php(121): SkinMustache->getTemplateData()
#19 /var/www/wiki/mw-1.43/includes/skins/SkinMustache.php(93): SkinFallback->getTemplateData()
#20 /var/www/wiki/mw-1.43/includes/skins/SkinTemplate.php(180): SkinMustache->generateHTML()
#21 /var/www/wiki/mw-1.43/includes/skins/Skin.php(683): SkinTemplate->outputPage()
#22 /var/www/wiki/mw-1.43/includes/Output/OutputPage.php(3193): Skin->outputPageFinal()
#23 /var/www/wiki/mw-1.43/includes/actions/ActionEntryPoint.php(163): MediaWiki\Output\OutputPage->output()
#24 /var/www/wiki/mw-1.43/includes/MediaWikiEntryPoint.php(200): MediaWiki\Actions\ActionEntryPoint->execute()
#25 /var/www/wiki/mw-1.43/index.php(58): MediaWiki\MediaWikiEntryPoint->run()
#26 /var/www/wiki/index.php(3): require(string)
#27 {main}

Digging deeper, the ScopedCallback parser lock in Parser::preprocess seems to have an off-by-one refcount when e.g. tooltip-pt-userpage is being parsed, and the ScopedCallback's destructor is never invoked (in time, that is, as it does run before shutdown is complete), thus never releasing the lock before the next message transform call begins. ScopedCallback::consume (assigning null) doesn't change anything, inlining lock() doesn't change anything, only manually invoking the destructor and nulling the reference helps.

Quite a debugging hell so I'm going to pretend this doesn't happen, as there's another sandbox I can use without this issue...

@ArthurTaylor and I are experiencing a similar issue (Parser state cleared while parsing, Linker::tooltipAndAccesskeyAttribs() in stack trace) exclusively when using Hebrew (?uselang=he) – the other languages mentioned here are working fine for us. In my testing, it affects any skin and any page as far as I can tell (even index.php?title=Special:BlankPage&uselang=he&useskin=fallback). As @Alex44019 wrote above, it really looks like PHP is getting confused about the refcount of the $magicScopeVariable in Parser::preprocess() and not calling its destructor; the following workaround, destructing it manually, works for me:

diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php
index fa2f447a3e..4f4c344c6a 100644
--- a/includes/parser/Parser.php
+++ b/includes/parser/Parser.php
@@ -932,20 +932,22 @@ public function preprocess(
 		$frame = false
 	) {
 		$magicScopeVariable = $this->lock();
 		$this->startParse( $page, $options, self::OT_PREPROCESS, true );
 		if ( $revid !== null ) {
 			$this->mRevisionId = $revid;
 		}
 		$this->hookRunner->onParserBeforePreprocess( $this, $text, $this->mStripState );
 		$text = $this->replaceVariables( $text, $frame );
 		$text = $this->mStripState->unstripBoth( $text );
+		$magicScopeVariable->__destruct();
+		ScopedCallback::cancel( $magicScopeVariable );
 		return $text;
 	}

I’m on PHP 8.3.15 (under Arch Linux); I don’t know which PHP version Arthur is using. And this is on latest MediaWiki core master (32dd3f30f6).

Edit: Still reproducible on PHP 8.4.5, cd9f2a127f.

I observe also this issue with $wgLanguageCode = 'fr' when I try editing a new page, no issue on an existing page. I have MW master 817e07006fd and no extension and no skin (not even Vector) and PHP 8.1.31. Also no issue on this page with other languages: I tested en, es, id, ja, ar, he, pl. The patch by @LucasWerkmeister in T366986#10553331 has no effect in my case.

No issue when I try editing a new page with the same MW version on PHP 8.2.27 or 8.3.17 or 8.4.4.

Given it seems to be linked to destructors and given it works (for me) on PHP >= 8.2, maybe some destructor is called too late in some function(s)?

My stacktrace on the edit page is below, slightly different than above

Original exception: [817d39a5aa72342a5c30ad1b] /mediawiki/master/index.php?title=Accueil2&action=edit LogicException: Parser state cleared while parsing. Did you call Parser::parse recursively? Lock is held by: #0 /mediawiki/master/includes/parser/Parser.php(677): MediaWiki\Parser\Parser->lock()
#1 /mediawiki/master/includes/language/MessageCache.php(1590): MediaWiki\Parser\Parser->parse()
#2 /mediawiki/master/includes/language/MessageCache.php(1535): MessageCache->parse()
#3 /mediawiki/master/includes/language/Message/Message.php(1458): MessageCache->parseWithPostprocessing()
#4 /mediawiki/master/includes/language/Message/Message.php(1049): MediaWiki\Message\Message->parseText()
#5 /mediawiki/master/includes/language/Message/Message.php(1090): MediaWiki\Message\Message->format()
#6 /mediawiki/master/includes/editpage/IntroMessageList.php(44): MediaWiki\Message\Message->parse()
#7 /mediawiki/master/includes/editpage/IntroMessageBuilder.php(444): MediaWiki\EditPage\IntroMessageList->add()
#8 /mediawiki/master/includes/editpage/IntroMessageBuilder.php(163): MediaWiki\EditPage\IntroMessageBuilder->addEditIntro()
#9 /mediawiki/master/includes/editpage/EditPage.php(2948): MediaWiki\EditPage\IntroMessageBuilder->getIntroMessages()
#10 /mediawiki/master/includes/editpage/EditPage.php(3041): MediaWiki\EditPage\EditPage->showIntro()
#11 /mediawiki/master/includes/editpage/EditPage.php(796): MediaWiki\EditPage\EditPage->showEditForm()
#12 /mediawiki/master/includes/actions/EditAction.php(66): MediaWiki\EditPage\EditPage->edit()
#13 /mediawiki/master/includes/actions/ActionEntryPoint.php(732): EditAction->show()
#14 /mediawiki/master/includes/actions/ActionEntryPoint.php(509): MediaWiki\Actions\ActionEntryPoint->performAction()
#15 /mediawiki/master/includes/actions/ActionEntryPoint.php(145): MediaWiki\Actions\ActionEntryPoint->performRequest()
#16 /mediawiki/master/includes/MediaWikiEntryPoint.php(202): MediaWiki\Actions\ActionEntryPoint->execute()
#17 /mediawiki/master/index.php(58): MediaWiki\MediaWikiEntryPoint->run()
#18 {main}
Backtrace:
from /mediawiki/master/includes/parser/Parser.php(6506)
#0 /mediawiki/master/includes/parser/Parser.php(677): MediaWiki\Parser\Parser->lock()
#1 /mediawiki/master/includes/language/MessageCache.php(1590): MediaWiki\Parser\Parser->parse()
#2 /mediawiki/master/includes/language/MessageCache.php(1535): MessageCache->parse()
#3 /mediawiki/master/includes/language/Message/Message.php(1458): MessageCache->parseWithPostprocessing()
#4 /mediawiki/master/includes/language/Message/Message.php(1049): MediaWiki\Message\Message->parseText()
#5 /mediawiki/master/includes/language/Message/Message.php(1090): MediaWiki\Message\Message->format()
#6 /mediawiki/master/includes/editpage/IntroMessageBuilder.php(555): MediaWiki\Message\Message->parse()
#7 /mediawiki/master/includes/editpage/IntroMessageBuilder.php(171): MediaWiki\EditPage\IntroMessageBuilder->addAnonEditWarning()
#8 /mediawiki/master/includes/editpage/EditPage.php(2948): MediaWiki\EditPage\IntroMessageBuilder->getIntroMessages()
#9 /mediawiki/master/includes/editpage/EditPage.php(3041): MediaWiki\EditPage\EditPage->showIntro()
#10 /mediawiki/master/includes/editpage/EditPage.php(796): MediaWiki\EditPage\EditPage->showEditForm()
#11 /mediawiki/master/includes/actions/EditAction.php(66): MediaWiki\EditPage\EditPage->edit()
#12 /mediawiki/master/includes/actions/ActionEntryPoint.php(732): EditAction->show()
#13 /mediawiki/master/includes/actions/ActionEntryPoint.php(509): MediaWiki\Actions\ActionEntryPoint->performAction()
#14 /mediawiki/master/includes/actions/ActionEntryPoint.php(145): MediaWiki\Actions\ActionEntryPoint->performRequest()
#15 /mediawiki/master/includes/MediaWikiEntryPoint.php(202): MediaWiki\Actions\ActionEntryPoint->execute()
#16 /mediawiki/master/index.php(58): MediaWiki\MediaWikiEntryPoint->run()
#17 {main}

You're hitting ->parse() on whichever message is being parsed when you get the error, instead of ->preprocess(); the workaround for parse will look something like this:

		$this->mRevisionUser = $oldRevisionUser;
		$this->mRevisionSize = $oldRevisionSize;
		$this->mInputSize = false;
		$this->currentRevisionCache = null;
+
+		if ( $clearState ) {
+			$magicScopeVariable->__destruct();
+			ScopedCallback::cancel( $magicScopeVariable );
+		}

		return $this->mOutput;

You're hitting ->parse() on whichever message is being parsed when you get the error, instead of ->preprocess(); the workaround for parse will look something like this:

		$this->mRevisionUser = $oldRevisionUser;
		$this->mRevisionSize = $oldRevisionSize;
		$this->mInputSize = false;
		$this->currentRevisionCache = null;
+
+		if ( $clearState ) {
+			$magicScopeVariable->__destruct();
+			ScopedCallback::cancel( $magicScopeVariable );
+		}

		return $this->mOutput;

Indeed, this patch works in my case, thanks!

I change the tags since as commented by @Alex44019 and myself, this issue occurs even without extensions.

I add the tags 1.43 and 1.44 because it is a bit critical in some configurations : partial break on some or any pages of MW core with PHP 8.1-8.4 in a few languages (exact occurences seems to depend on the language and PHP version).

Tag #ctt-attention on gerrit if you upload a patch for this. It looks like there are proposed fixes above. What would be really nice is a test case demonstrating the crash.

I’m still able to reproduce the issue with uselang=he as well as uselang=pt; and thanks to @mszabo’s hint at T402278#11106001, I discovered that turning off xdebug seems to fix this issue. So this is almost certainly another issue caused by https://bugs.xdebug.org/view.php?id=2222, where xdebug messes with the lifetime of objects if an exception is thrown somewhere. (Indeed @Krinkle seems to have discovered it independently in T361419#10616730, which is the task linked from that bug report.)

If xdebug won’t fix this issue (apparently they consider it a feature), perhaps we should stop relying on scoped callbacks :/ I suspect most of them can be rewritten into a form like

git diff -w
diff --git i/includes/parser/Parser.php w/includes/parser/Parser.php
index da3940fa8b..95c4bfabd9 100644
--- i/includes/parser/Parser.php
+++ w/includes/parser/Parser.php
@@ -870,7 +870,7 @@ public function preprocess(
 		$revid = null,
 		$frame = false
 	) {
-		$magicScopeVariable = $this->lock();
+		return $this->doWithLock( function () use ( $text, $page, $options, $revid, $frame ) {
 			$this->startParse( $page, $options, self::OT_PREPROCESS, true );
 			if ( $revid !== null ) {
 				$this->mRevisionId = $revid;
@@ -879,6 +879,7 @@ public function preprocess(
 			$text = $this->replaceVariables( $text, $frame );
 			$text = $this->mStripState->unstripBoth( $text );
 			return $text;
+		} );
 	}
 
 	/**

We could document somewhere that running MW with xdebug requires xdebug.mode to not include develop. Could even throw an error if xdebug is loaded and this setting is incorrect.

I see, I didn’t realize it was limited to just one xdebug mode that’s not even the most important one. With xdebug.mode=debug I still have a step debugger and the issue no longer happens.

I don’t know how many users or developers use the develop mode, and how many of them actually rely on it. (Asides from breaking program semantics, develop mode is also responsible for showing formatted stack traces, but in my experience the usefulness of these is so-so.) I’d be up for trying out a warning or error about it…