mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-02 05:55:38 +00:00
Improve the fix for #9131. We were previously counting passes
through this routine, which means: one for every character, more or less. So long strings would hit the "recursion limit". But what we are worried about is an infinite loop caused by misues of macros, so that is what we need to count.
This commit is contained in:
parent
b128f3de14
commit
5579d3734a
@ -488,7 +488,7 @@ docstring BibTeXInfo::expandFormat(docstring const & format,
|
|||||||
// we'll remove characters from the front of fmt as we
|
// we'll remove characters from the front of fmt as we
|
||||||
// deal with them
|
// deal with them
|
||||||
while (!fmt.empty()) {
|
while (!fmt.empty()) {
|
||||||
if (counter++ > max_passes) {
|
if (counter > max_passes) {
|
||||||
LYXERR0("Recursion limit reached while parsing `"
|
LYXERR0("Recursion limit reached while parsing `"
|
||||||
<< format << "'.");
|
<< format << "'.");
|
||||||
return _("ERROR!");
|
return _("ERROR!");
|
||||||
@ -506,6 +506,7 @@ docstring BibTeXInfo::expandFormat(docstring const & format,
|
|||||||
string const val =
|
string const val =
|
||||||
buf.params().documentClass().getCiteMacro(engine_type, key);
|
buf.params().documentClass().getCiteMacro(engine_type, key);
|
||||||
fmt = from_utf8(val) + fmt.substr(1);
|
fmt = from_utf8(val) + fmt.substr(1);
|
||||||
|
counter += 1;
|
||||||
continue;
|
continue;
|
||||||
} else if (key[0] == '_') {
|
} else if (key[0] == '_') {
|
||||||
// a translatable bit
|
// a translatable bit
|
||||||
@ -550,12 +551,15 @@ docstring BibTeXInfo::expandFormat(docstring const & format,
|
|||||||
getValueForKey(optkey, buf, before, after, dialog, xref);
|
getValueForKey(optkey, buf, before, after, dialog, xref);
|
||||||
if (optkey == "next" && next)
|
if (optkey == "next" && next)
|
||||||
ret << ifpart; // without expansion
|
ret << ifpart; // without expansion
|
||||||
else if (!val.empty())
|
else if (!val.empty()) {
|
||||||
ret << expandFormat(ifpart, xref, counter, buf,
|
int newcounter = 0;
|
||||||
|
ret << expandFormat(ifpart, xref, newcounter, buf,
|
||||||
before, after, dialog, next);
|
before, after, dialog, next);
|
||||||
else if (!elsepart.empty())
|
} else if (!elsepart.empty()) {
|
||||||
ret << expandFormat(elsepart, xref, counter, buf,
|
int newcounter = 0;
|
||||||
|
ret << expandFormat(elsepart, xref, newcounter, buf,
|
||||||
before, after, dialog, next);
|
before, after, dialog, next);
|
||||||
|
}
|
||||||
// fmt will have been shortened for us already
|
// fmt will have been shortened for us already
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user