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:
Richard Heck 2014-05-23 11:19:14 -04:00
parent b128f3de14
commit 5579d3734a

View File

@ -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;
} }