From 71c439a6604c242339141df28f6082d8f78eb2e8 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Wed, 13 Mar 2013 16:59:32 +0000 Subject: Resolves: rhbz#918938 crash in danish thesaurus/spell interaction Change-Id: I911fc382a8e4b895262dcd5ae5c67c4a81e6aad4 Reviewed-on: https://gerrit.libreoffice.org/2710 Reviewed-by: Fridrich Strba Tested-by: Fridrich Strba Reviewed-on: https://gerrit.libreoffice.org/2720 Reviewed-by: Michael Stahl --- hunspell/UnpackedTarball_hunspell.mk | 1 + hunspell/hunspell.rhbz918938.patch | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 hunspell/hunspell.rhbz918938.patch (limited to 'hunspell') diff --git a/hunspell/UnpackedTarball_hunspell.mk b/hunspell/UnpackedTarball_hunspell.mk index 9ba9dc309a46..1e0544af0dac 100644 --- a/hunspell/UnpackedTarball_hunspell.mk +++ b/hunspell/UnpackedTarball_hunspell.mk @@ -19,6 +19,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,hunspell,\ hunspell/hunspell-1.3.2-nullptr.patch \ hunspell/hunspell-1.3.2-literal.patch \ hunspell/hunspell-1.3.2-compound.patch \ + hunspell/hunspell.rhbz918938.patch \ )) ifeq ($(COM),MSC) diff --git a/hunspell/hunspell.rhbz918938.patch b/hunspell/hunspell.rhbz918938.patch new file mode 100644 index 000000000000..f1bdbd4ff8ba --- /dev/null +++ b/hunspell/hunspell.rhbz918938.patch @@ -0,0 +1,72 @@ +--- misc/hunspell-1.3.2/src/hunspell/hunspell.cxx 2011-02-02 12:04:29.000000000 +0000 ++++ misc/build/hunspell-1.3.2/src/hunspell/hunspell.cxx 2013-03-13 16:50:50.667928521 +0000 +@@ -12,6 +12,8 @@ + #endif + #include "csutil.hxx" + ++#include ++ + Hunspell::Hunspell(const char * affpath, const char * dpath, const char * key) + { + encoding = NULL; +@@ -1710,6 +1712,19 @@ + return n; + } + ++namespace ++{ ++ void myrep(std::string& str, const std::string& search, const std::string& replace) ++ { ++ size_t pos = 0; ++ while ((pos = str.find(search, pos)) != std::string::npos) ++ { ++ str.replace(pos, search.length(), replace); ++ pos += replace.length(); ++ } ++ } ++} ++ + int Hunspell::spellml(char*** slst, const char * word) + { + char *q, *q2; +@@ -1721,26 +1736,26 @@ + q2 = strstr(q2, "'), MAXWORDUTF8LEN - 10)) n = analyze(slst, cw); + if (n == 0) return 0; + // convert the result to ana1ana2 format +- for (int i = 0; i < n; i++) s+= strlen((*slst)[i]); +- char * r = (char *) malloc(6 + 5 * s + 7 * n + 7 + 1); // XXX 5*s->&->& +- if (!r) return 0; +- strcpy(r, ""); ++ std::string r; ++ r.append(""); + for (int i = 0; i < n; i++) { +- int l = strlen(r); +- strcpy(r + l, ""); +- strcpy(r + l + 3, (*slst)[i]); +- mystrrep(r + l + 3, "\t", " "); +- mystrrep(r + l + 3, "<", "<"); +- mystrrep(r + l + 3, "&", "&"); +- strcat(r, ""); ++ r.append(""); ++ ++ std::string entry((*slst)[i]); + free((*slst)[i]); ++ myrep(entry, "\t", " "); ++ myrep(entry, "&", "&"); ++ myrep(entry, "<", "<"); ++ r.append(entry); ++ ++ r.append(""); + } +- strcat(r, ""); +- (*slst)[0] = r; ++ r.append(""); ++ (*slst)[0] = mystrdup(r.c_str()); + return 1; + } else if (check_xml_par(q, "type=", "stem")) { + if (get_xml_par(cw, strchr(q2, '>'), MAXWORDUTF8LEN - 1)) return stem(slst, cw); -- cgit