commit 7dc9e4a1e72b7778eb4b7cf20dd1ae53fe673591
Author: Juergen Spitzmueller <[email protected]>
Date:   Fri Jan 9 17:49:44 2026 +0100

    Fix crash with missing citeengine
---
 src/BufferParams.cpp             |  4 +++-
 src/CiteEnginesList.cpp          | 16 ++++++++++++++++
 src/CiteEnginesList.h            |  3 +++
 src/frontends/qt/GuiDocument.cpp | 18 ++++++++++--------
 4 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 2fdafa1db8..f0207ad711 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -4474,7 +4474,9 @@ string const BufferParams::bibtexCommand(bool const warn) 
const
 
 bool BufferParams::useBiblatex() const
 {
-       return theCiteEnginesList[citeEngine()]->getCiteFramework() == 
"biblatex";
+       return theCiteEnginesList[citeEngine()]
+                       ? theCiteEnginesList[citeEngine()]->getCiteFramework() 
== "biblatex"
+                       : false;
 }
 
 
diff --git a/src/CiteEnginesList.cpp b/src/CiteEnginesList.cpp
index 7006356ece..15b89c60bc 100644
--- a/src/CiteEnginesList.cpp
+++ b/src/CiteEnginesList.cpp
@@ -310,4 +310,20 @@ LyXCiteEngine * CiteEnginesList::operator[](string const & 
str)
        return nullptr;
 }
 
+
+LyXCiteEngine const * CiteEnginesList::getCiteEngine(string const & str) const
+{
+       LyXCiteEngine * fallback = nullptr;
+       for (auto & eng : englist_) {
+               if (eng.getID() == str)
+                       return &eng;
+               else if (eng.getID() == "basic")
+                       fallback = const_cast<LyXCiteEngine *>(&eng);
+       }
+       if (!fallback)
+               LYXERR0("Basic cite engine not found! Your installation is 
corrupted.");
+
+       return fallback;
+}
+
 } // namespace lyx
diff --git a/src/CiteEnginesList.h b/src/CiteEnginesList.h
index 2979f004bc..dde6e02968 100644
--- a/src/CiteEnginesList.h
+++ b/src/CiteEnginesList.h
@@ -140,6 +140,9 @@ public:
        LyXCiteEngine const * operator[](std::string const & str) const;
        ///
        LyXCiteEngine * operator[](std::string const & str);
+       /// Returns a pointer to the LyXCiteEngine with filename str.
+       /// Returns a pointer to basic citeengine if no such engine is found.
+       LyXCiteEngine const * getCiteEngine(std::string const & str) const;
        private:
        /// noncopyable
        CiteEnginesList(CiteEnginesList const &);
diff --git a/src/frontends/qt/GuiDocument.cpp b/src/frontends/qt/GuiDocument.cpp
index 48cb00ef4d..71b9f60790 100644
--- a/src/frontends/qt/GuiDocument.cpp
+++ b/src/frontends/qt/GuiDocument.cpp
@@ -3226,7 +3226,7 @@ void GuiDocument::resetDefaultBibfile(string const & 
which)
                CiteEngineType(biblioModule->citeStyleCO->itemData(
                                                          
biblioModule->citeStyleCO->currentIndex()).toInt());
 
-       
updateDefaultBiblio(theCiteEnginesList[fromqstr(engine)]->getDefaultBiblio(cet),
 which);
+       
updateDefaultBiblio(theCiteEnginesList.getCiteEngine(fromqstr(engine))->getDefaultBiblio(cet),
 which);
 }
 
 
@@ -3248,7 +3248,7 @@ void GuiDocument::citeEngineChanged(int n)
                biblioModule->citeEngineCO->itemData(n).toString();
 
        vector<string> const engs =
-               theCiteEnginesList[fromqstr(engine)]->getEngineType();
+               
theCiteEnginesList.getCiteEngine(fromqstr(engine))->getEngineType();
 
        updateCiteStyles(engs);
        updateEngineDependends();
@@ -3263,7 +3263,7 @@ void GuiDocument::updateEngineDependends()
        QString const engine =
                biblioModule->citeEngineCO->itemData(
                                
biblioModule->citeEngineCO->currentIndex()).toString();
-       LyXCiteEngine const * ce = theCiteEnginesList[fromqstr(engine)];
+       LyXCiteEngine const * ce = 
theCiteEnginesList.getCiteEngine(fromqstr(engine));
 
        bool const biblatex = isBiblatex();
        bool const citepack = biblatex
@@ -3299,7 +3299,8 @@ void GuiDocument::citeStyleChanged()
        QString const currentDef = isBiblatex() ?
                biblioModule->biblatexBbxCO->currentText()
                : biblioModule->defaultBiblioCO->currentText();
-       if 
(theCiteEnginesList[fromqstr(engine)]->isDefaultBiblio(fromqstr(currentDef)))
+       if (theCiteEnginesList[fromqstr(engine)]
+           && 
theCiteEnginesList[fromqstr(engine)]->isDefaultBiblio(fromqstr(currentDef)))
                resetDefaultBibfile();
 
        biblioChanged();
@@ -3679,7 +3680,8 @@ void GuiDocument::applyView()
 
        CiteEngineType const style = 
CiteEngineType(biblioModule->citeStyleCO->itemData(
                biblioModule->citeStyleCO->currentIndex()).toInt());
-       if (theCiteEnginesList[engine]->hasEngineType(style))
+       if (theCiteEnginesList[engine]
+           && theCiteEnginesList[engine]->hasEngineType(style))
                bp_.setCiteEngineType(style);
        else
                bp_.setCiteEngineType(ENGINE_TYPE_DEFAULT);
@@ -5004,8 +5006,8 @@ bool GuiDocument::isBiblatex() const
        // this can happen if the cite engine is unknown, which can happen
        // if one is using a file that came from someone else, etc. in that
        // case, we crash if we proceed.
-       if (engine.isEmpty())
-           return false;
+       if (engine.isEmpty() || !theCiteEnginesList[fromqstr(engine)])
+               return false;
 
        return theCiteEnginesList[fromqstr(engine)]->getCiteFramework() == 
"biblatex";
 }
@@ -5128,7 +5130,7 @@ void GuiDocument::updateResetDefaultBiblio()
                CiteEngineType(biblioModule->citeStyleCO->itemData(
                                                          
biblioModule->citeStyleCO->currentIndex()).toInt());
 
-       string const defbib = 
theCiteEnginesList[fromqstr(engine)]->getDefaultBiblio(cet);
+       string const defbib = 
theCiteEnginesList.getCiteEngine(fromqstr(engine))->getDefaultBiblio(cet);
        if (isBiblatex()) {
                QString const bbx = biblioModule->biblatexBbxCO->currentText();
                QString const cbx = biblioModule->biblatexCbxCO->currentText();
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to