Fix crash with info inset and dialogs

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.
This commit is contained in:
Jean-Marc Lasgouttes 2023-02-06 21:34:08 +01:00
parent 04ece4f0d6
commit 17e60e2e85
2 changed files with 9 additions and 1 deletions

View 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);
}

View File

@ -236,6 +236,8 @@ private:
void build();
///
bool initialized_;
/// true when metrics Row object should not be used
mutable bool dirty_;
///
InsetInfoParams params_;
///