Avoid recursion when validating a macro that is defined recursively.
This avoids a crash but the latex engine will choke on it, of course.
This commit is contained in:
Enrico Forestieri 2023-01-28 09:03:49 +01:00
parent fef787a80a
commit 8bc83f123a
2 changed files with 12 additions and 2 deletions

View File

@ -917,10 +917,19 @@ void InsetMathMacro::validate(LaTeXFeatures & features) const
MathData ar(const_cast<Buffer *>(&buffer())); MathData ar(const_cast<Buffer *>(&buffer()));
MacroData const * data = buffer().getMacro(name()); MacroData const * data = buffer().getMacro(name());
if (data) { if (data) {
asArray(data->definition(), ar); // Avoid recursion on a recursive macro definition
docstring const & def = data->definition();
int pos = tokenPos(def, '\\', name());
char_type c = pos + name().size() < def.size()
? def.at(pos + name().size()) : 0;
if (pos < 0 || (name().size() > 1 &&
((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z')))) {
asArray(def, ar);
ar.validate(features); ar.validate(features);
} }
} }
}
InsetMathNest::validate(features); InsetMathNest::validate(features);
} }

View File

@ -42,6 +42,7 @@ What's new
* USER INTERFACE * USER INTERFACE
- Avoid crashing on a recursive macro definition (bug 12633).
* INTERNALS * INTERNALS