summaryrefslogtreecommitdiff
path: root/hunspell
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2013-03-13 16:59:32 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-03-13 17:04:26 +0000
commitda2c8c7d1789109fd4099731f2f0188c540aa94d (patch)
treeac98445e93ef659534cec301f85b86bf4b4f8c21 /hunspell
parent7cce1a450c4dd818e7b050313552d722a17f6c36 (diff)
Resolves: rhbz#918938 crash in danish thesaurus/spell interaction
Change-Id: I911fc382a8e4b895262dcd5ae5c67c4a81e6aad4
Diffstat (limited to 'hunspell')
-rw-r--r--hunspell/UnpackedTarball_hunspell.mk1
-rw-r--r--hunspell/hunspell.rhbz918938.patch72
2 files changed, 73 insertions, 0 deletions
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..8d235030a8ff
--- /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 <string>
++
+ 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, "<word");
+ if (!q2) return 0; // bad XML input
+ if (check_xml_par(q, "type=", "analyze")) {
+- int n = 0, s = 0;
++ int n = 0;
+ if (get_xml_par(cw, strchr(q2, '>'), MAXWORDUTF8LEN - 10)) n = analyze(slst, cw);
+ if (n == 0) return 0;
+ // convert the result to <code><a>ana1</a><a>ana2</a></code> 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->&->&amp;
+- if (!r) return 0;
+- strcpy(r, "<code>");
++ std::string r;
++ r.append("<code>");
+ for (int i = 0; i < n; i++) {
+- int l = strlen(r);
+- strcpy(r + l, "<a>");
+- strcpy(r + l + 3, (*slst)[i]);
+- mystrrep(r + l + 3, "\t", " ");
+- mystrrep(r + l + 3, "<", "&lt;");
+- mystrrep(r + l + 3, "&", "&amp;");
+- strcat(r, "</a>");
++ r.append("<a>");
++
++ std::string entry((*slst)[i]);
+ free((*slst)[i]);
++ myrep(entry, "\t", " ");
++ myrep(entry, "<", "&lt;");
++ myrep(entry, "&", "&amp;");
++ r.append(entry);
++
++ r.append("</a>");
+ }
+- strcat(r, "</code>");
+- (*slst)[0] = r;
++ r.append("</code>");
++ (*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);