commit 6d63895887929a5211f8bff93522d9a83624f03a
Author: Richard Heck <[email protected]>
Date:   Thu Feb 13 18:01:41 2014 -0500

    Fix bug #8944 by introducing a maximum size for keys we process.
    
    Backported from b7a1eb68e1.

diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp
index 1d76f95..689a570 100644
--- a/src/BiblioInfo.cpp
+++ b/src/BiblioInfo.cpp
@@ -228,9 +228,9 @@ docstring const BibTeXInfo::getAbbreviatedAuthor() const
                return authors;
        }
 
-       docstring author = convertLaTeXCommands(operator[]("author"));
+       docstring author = operator[]("author");
        if (author.empty()) {
-               author = convertLaTeXCommands(operator[]("editor"));
+               author = operator[]("editor");
                if (author.empty())
                        return bib_key_;
        }
@@ -243,15 +243,17 @@ docstring const BibTeXInfo::getAbbreviatedAuthor() const
        vector<docstring> const authors =
                getVectorFromString(author, from_ascii(" and "));
 
+       docstring retval = familyName(authors[0]);
+
        if (authors.size() == 2 && authors[1] != "others")
-               return bformat(from_ascii("%1$s and %2$s"),
+               retval = bformat(from_ascii("%1$s and %2$s"),
                        familyName(authors[0]), familyName(authors[1]));
 
        if (authors.size() >= 2)
-               return bformat(from_ascii("%1$s et al."),
+               retval = bformat(from_ascii("%1$s et al."),
                        familyName(authors[0]));
 
-       return familyName(authors[0]);
+       return convertLaTeXCommands(retval);
 }
 
 
@@ -417,6 +419,13 @@ docstring BibTeXInfo::expandFormat(string const & format,
 {
        // incorrect use of macros could put us in an infinite loop
        static int max_passes = 5000;
+
+       // the use of overly large keys can lead to performance problems, due
+       // to eventual attempts to convert LaTeX macros to unicode. See bug
+       // #8944. This is perhaps not the best solution, but it will have to
+       // do for now.
+       static size_t const max_keysize = 128;
+
        docstring ret; // return value
        string key;
        bool scanning_key = false;
@@ -453,7 +462,7 @@ docstring BibTeXInfo::expandFormat(string const & format,
                                                
translateIfPossible(from_utf8(val), buf.params().language->code());
                                        ret += trans;
                                } else {
-                                       docstring const val = 
getValueForKey(key, xref);
+                                       docstring const val = 
getValueForKey(key, xref, max_keysize);
                                        if (richtext && !scanning_rich)
                                                ret += from_ascii("<span 
class=\"bib-" + key + "\">");
                                        ret += val;
@@ -588,12 +597,17 @@ docstring const & BibTeXInfo::operator[](string const & 
field) const
 
 
 docstring BibTeXInfo::getValueForKey(string const & key, 
-               BibTeXInfo const * const xref) const
+               BibTeXInfo const * const xref, size_t maxsize) const
 {
-       docstring const ret = operator[](key);
-       if (!ret.empty() || !xref)
-               return ret;
-       return (*xref)[key];
+       // anything less is pointless
+       LASSERT(maxsize >= 16, maxsize = 16);
+       docstring ret = operator[](key);
+       if (ret.empty() && xref)
+               ret = (*xref)[key];
+       // make sure it is not too big
+       if (ret.size() > maxsize)
+               ret = ret.substr(0, maxsize - 3) + from_ascii("...");
+       return ret;
 }
 
 
diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h
index 759d253..632494a 100644
--- a/src/BiblioInfo.h
+++ b/src/BiblioInfo.h
@@ -109,7 +109,7 @@ private:
        /// to get the data from xref BibTeXInfo object, which would normally
        /// be the one referenced in the crossref field.
        docstring getValueForKey(std::string const & key, 
-                       BibTeXInfo const * const xref = 0) const;
+                       BibTeXInfo const * const xref, size_t maxsize = 4096) 
const;
        /// replace %keys% in a format string with their values
        /// called from getInfo()
        /// format strings may contain:
diff --git a/status.20x b/status.20x
index c36ecea..eb077d8 100644
--- a/status.20x
+++ b/status.20x
@@ -67,7 +67,7 @@ What's new
 - Fix outliner-related crash when master and child are open in different
   windows (bug 8948).
 
-- Correctly compare documents with different author sets (bug 8769).
+- Fix hang when using BibTeX files with really long author lists (bug 8944).
 
 - Fix crash with changetracking in bibliography environment (bug 8646).
 
@@ -76,8 +76,10 @@ What's new
 - Fix math-ams-matrix function that could corrupt documents if not used 
properly
   (part of bug 8359).
 
-- Fix problem that led to assertion in some cases when space was at
-  beginning of line (bugs 8838 and 8947).
+- Fix problem that led to assertion in some cases when space was at beginning 
of 
+  line (bugs 8838 and 8947).
+
+- Correctly compare documents with different author sets (bug 8769).
 
 - Fix drawing of table lines of multicolumns (bug 8082).
 
@@ -85,8 +87,6 @@ What's new
 
 - Handle undo in `branch-add' function.
 
-- Fix the missing dynamic menus in general and restore correctly from 
fullscreen.
-
 - Prevent recurrent pop-up of "missing module requirements" warning (bug 8864).
 
 

Reply via email to