]> git.lyx.org Git - lyx.git/commitdiff
Fix crash with info inset and dialogs
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 6 Feb 2023 20:34:08 +0000 (21:34 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 6 Feb 2023 20:34:08 +0000 (21:34 +0100)
See the thread
  2.4 Crash (was: Updated LaTeXConfig.lyx (bxjsclasses added))
on lyx-devel (26/01/2023).

The backtrace imply a problem like:
1/ metrics are computed for some info inset
2/ the info inset is regenerated (and thus the paragraph it held is now invalid)
3/ We draw the inset and because of the new (disabled by default)
   bookmark display code, we access the id() of the invalid paragraph.
4/ boom!

To fix the issue, introduce a new boolean member that indicates when
the Row object of the metrics should not be used. In this case, the
draw() method returns early.

src/insets/InsetInfo.cpp
src/insets/InsetInfo.h

index 46d656c817c9ad9d78a221f321867717e368c566..f2d3b93ad8edd7e4f76432abfa80cae0d9166eb1 100644 (file)
@@ -467,7 +467,7 @@ string InsetInfoParams::infoType() const
 
 
 InsetInfo::InsetInfo(Buffer * buf, string const & info)
-       : InsetCollapsible(buf), initialized_(false)
+       : InsetCollapsible(buf), initialized_(false), dirty_(true)
 {
        params_.type = InsetInfoParams::UNKNOWN_INFO;
        params_.force_ltr = false;
@@ -779,15 +779,19 @@ void InsetInfo::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        const_cast<InsetInfo *>(this)->build();
        InsetCollapsible::metrics(mi, dim);
+       dirty_ = false;
 }
 
 
 void InsetInfo::draw(PainterInfo & pi, int x, int y) const
 {
+       if (dirty_)
+               return;
        Changer chg = changeVar(lyxrc.mark_foreign_language, false);
        InsetCollapsible::draw(pi, x, y);
 }
 
+
 void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype, bool const deleted)
 
 {
@@ -1235,6 +1239,8 @@ void InsetInfo::build()
        }
        }
 
+       // indicate that metrics are not usable anymore
+       dirty_ = true;
        // Just to do something with that string
        LYXERR(Debug::INFO, "info inset text: " << gui);
 }
index 3531b41681204964af5ea1be556b3e55fc176be1..17d60e291d5976e0c30e8d62194431c49387f322 100644 (file)
@@ -236,6 +236,8 @@ private:
        void build();
        ///
        bool initialized_;
+       /// true when metrics Row object should not be used
+       mutable bool dirty_;
        ///
        InsetInfoParams params_;
        ///