On Sun, Sep 11, 2016 at 09:04:56PM +0100, Guillaume Munch wrote:
> Le 11/09/2016 à 11:05, Enrico Forestieri a écrit :
> 
> >Please give
> >steps or test cases for reproducing the crash and I will have a look.
> >
> 
> It usually takes some effort. I'll try to find the time.

You can spare your time as I think I found the problem. The patch simply
uncovered a latent bug. The crash only occurs when there is a user
defined math macro. In this case, d->macro_->symbol() may return bogus
values. For a user defined macro it should always return a null pointer,
but for unknown reasons it sometimes returns strange values, which are
clearly bogus and cause a crash when dereferenced.

I did not succeed in understanding why this occurs. Simply left clicking
here and there can trigger the crash. Not always, but insisting long
enough it eventually occurs.

The attached patch solves the issue for me. It is not ideal because it
simply covers the real bug. When a user defined macro is detected, the
value returned by d->macro_->symbol() is simply not used, as in this
case we know what to do.

Please test if you find the time.

-- 
Enrico
diff --git a/src/mathed/MathMacro.cpp b/src/mathed/MathMacro.cpp
index 4529cf9..3a4d3fb 100644
--- a/src/mathed/MathMacro.cpp
+++ b/src/mathed/MathMacro.cpp
@@ -614,7 +614,8 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
 		drawMarkers2(pi, expx, expy);
 	} else {
 		bool drawBox = lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX;
-		bool upshape = d->macro_ && d->macro_->symbol()
+		bool user_macro = mathedWordList().find(name()) == mathedWordList().end();
+		bool upshape = user_macro ? false : d->macro_ && d->macro_->symbol()
 				&& d->macro_->symbol()->extra == "textmode";
 		Changer dummy = pi.base.font.changeShape(upshape ? UP_SHAPE
 							: pi.base.font.shape());
@@ -929,9 +930,10 @@ bool MathMacro::folded() const
 
 void MathMacro::write(WriteStream & os) const
 {
-	bool const textmode_macro = d->macro_ && d->macro_->symbol()
+	bool user_macro = mathedWordList().find(name()) == mathedWordList().end();
+	bool textmode_macro = user_macro ? false : d->macro_ && d->macro_->symbol()
 				&& d->macro_->symbol()->extra == "textmode";
-	bool const needs_mathmode = d->macro_ && (!d->macro_->symbol()
+	bool needs_mathmode = user_macro ? true : d->macro_ && (!d->macro_->symbol()
 				|| d->macro_->symbol()->extra != "textmode");
 
 	MathEnsurer ensurer(os, needs_mathmode, true, textmode_macro);

Reply via email to