sc/qa/unit/tiledrendering/data/validationcrash.xlsx |binary sc/qa/unit/tiledrendering/tiledrendering.cxx | 18 ++++++++++++++++++ vcl/jsdialog/jsdialogbuilder.cxx | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-)
New commits: commit 1bd0b9bf1d986a538d29687c3d7996f46e8414e2 Author: Dennis Francis <[email protected]> AuthorDate: Fri Feb 20 22:37:44 2026 +0530 Commit: Miklos Vajna <[email protected]> CommitDate: Tue Feb 24 13:00:44 2026 +0100 lok: do not crash on pre-existing lok-notifier Bug fixed: Open a spreadsheet in cool with a cell with validation, enter invalid data ==> core-side crashes: 0x00007f4a16462639 in __assert_fail_base.cold () at /lib64/libc.so.6 0x00007f4a0fa38830 in vcl::Window::SetLOKNotifier (this=this@entry=0x2d4e87d0, pNotifier=pNotifier@entry=0x2cc13888, bParent=bParent@entry=false) at /var/home/dennis/devel/core/vcl/source/window/window.cxx:3182 0x00007f4a100f3c7f in JSInstanceBuilder::CreateMessageDialog (pParent=<optimized out>, eMessageType=VclMessageType::Info, eButtonType=VclButtonsType::OkCancel, rPrimaryMessage="Error: Data type mismatch. This field accepts numeric values only.", pNotifier=0x2cc13888) at /var/home/dennis/devel/core/vcl/jsdialog/jsdialogbuilder.cxx:937 0x00007f49f4443896 in ScValidationData::DoError (this=this@entry=0x7f49d0175fd0, pParent=<optimized out>, rInput="42", rPos=..., callback=...) at /var/home/dennis/devel/core/sc/source/core/data/validat.cxx:415 0x00007f49f4783a1a in ScInputHandler::EnterHandler (this=0x2cbb4f70, nBlockMode=nBlockMode@entry=ScEnterMode::NORMAL, bBeforeSavingInLOK=false) at /var/home/dennis/devel/core/sc/source/ui/app/inputhdl.cxx:3232 0x00007f49f47a2750 in ScModule::InputEnterHandler (this=this@entry=0x2ccbfa80, nBlockMode=nBlockMode@entry=ScEnterMode::NORMAL, bBeforeSavingInLOK=bBeforeSavingInLOK@entry=false) at /var/home/dennis/devel/core/sc/source/ui/app/scmod.cxx:1460 Fix: call SetLOKNotifier() only if it does not already have a lok-notifier. Signed-off-by: Dennis Francis <[email protected]> Change-Id: Ic857c3f4fc25302cc6c2c980f9e78a4218d2d471 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199901 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> diff --git a/sc/qa/unit/tiledrendering/data/validationcrash.xlsx b/sc/qa/unit/tiledrendering/data/validationcrash.xlsx new file mode 100644 index 000000000000..bdd815d66742 Binary files /dev/null and b/sc/qa/unit/tiledrendering/data/validationcrash.xlsx differ diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx index 87c4b94a55f9..95449dba2661 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -3720,6 +3720,24 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testLOKLanguageStatus) } } +CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testValidationCellCrash) +{ + ScModelObj* pModelObj = createDoc("validationcrash.xlsx"); + pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); + CPPUNIT_ASSERT(pModelObj); + ScDocShell* pDocSh = dynamic_cast< ScDocShell* >( pModelObj->GetEmbeddedObject() ); + CPPUNIT_ASSERT(pDocSh); + ScDocument* pDoc = pModelObj->GetDocument(); + CPPUNIT_ASSERT(pDoc); + + ScTestViewCallback aView1; + SfxViewShell* pView1 = SfxViewShell::Current(); + ScTabViewShell* pView = dynamic_cast<ScTabViewShell*>(pView1); + CPPUNIT_ASSERT(pView); + typeCharsInCell("42", 0, 1, pView, pModelObj, false /* bInEdit */, true /* bCommit */); // Type "42" in A2. + // Without the fix this will crash. +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index bca7c6de7d69..9bab565cf03f 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -932,7 +932,8 @@ JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParent, VclMessageType eMe VclPtrInstance<::MessageDialog> xMessageDialog(pParentWidget, rPrimaryMessage, eMessageType, eButtonType); - if (pNotifier) + // SetLOKNotifier() asserts that xMessageDialog has no LOKNotifier already. + if (pNotifier && !xMessageDialog->GetLOKNotifier()) xMessageDialog->SetLOKNotifier(pNotifier); pNotifier = xMessageDialog->GetLOKNotifier();
