| |
| |
| ==== //depot//src/hunspell/license.hunspell |
| --- /google/src/files/a/depot//src/hunspell/license.hunspell 2013-07-24 23:12:12.000000000 -0400 |
| +++ /google/src/files/b/depot//src/hunspell/license.hunspell 2013-10-01 01:04:03.000000000 -0400 |
| @@ -56,4 +56,6 @@ |
| * |
| * ***** END LICENSE BLOCK ***** */ |
| |
| +/* This isn't needed to be compiled. |
| #include "config.h" |
| +*/ |
| ==== //depot//src/hunspell/hunspell.cxx |
| --- /google/src/files/a/depot//src/hunspell/hunspell.cxx 2013-07-24 23:12:12.000000000 -0400 |
| +++ /google/src/files/b/depot//src/hunspell/hunspell.cxx 2013-10-01 01:04:03.000000000 -0400 |
| @@ -8,9 +8,11 @@ |
| |
| #include "hunspell.hxx" |
| #include "hunspell.h" |
| +/* This is not required |
| #ifndef MOZILLA_CLIENT |
| # include "config.h" |
| #endif |
| +*/ |
| #include "csutil.hxx" |
| |
| Hunspell::Hunspell(const char * affpath, const char * dpath, const char * key) |
| ==== //depot//src/hunspell/csutil.cxx |
| --- /google/src/files/a/depot//src/hunspell/csutil.cxx 2013-07-24 23:12:12.000000000 -0400 |
| +++ /google/src/files/b/depot//src/hunspell/csutil.cxx 2013-10-01 01:04:03.000000000 -0400 |
| @@ -10,13 +10,6 @@ |
| #include "atypes.hxx" |
| #include "langnum.hxx" |
| |
| -// Unicode character encoding information |
| -struct unicode_info { |
| - unsigned short c; |
| - unsigned short cupper; |
| - unsigned short clower; |
| -}; |
| - |
| #ifdef OPENOFFICEORG |
| # include <unicode/uchar.h> |
| #else |
| ==== //depot//src/hunspell/csutil.hxx |
| --- /google/src/files/a/depot//src/hunspell/csutil.hxx 2013-07-24 23:12:12.000000000 -0400 |
| +++ /google/src/files/b/depot//src/hunspell/csutil.hxx 2013-10-01 01:04:03.000000000 -0400 |
| @@ -116,6 +116,13 @@ |
| unsigned char cupper; |
| }; |
| |
| +// Unicode character encoding information |
| +struct unicode_info { |
| + unsigned short c; |
| + unsigned short cupper; |
| + unsigned short clower; |
| +}; |
| + |
| LIBHUNSPELL_DLL_EXPORTED int initialize_utf_tbl(); |
| LIBHUNSPELL_DLL_EXPORTED void free_utf_tbl(); |
| LIBHUNSPELL_DLL_EXPORTED unsigned short unicodetoupper(unsigned short c, int langnum); |
| ==== //depot//src/hunspell/suggestmgr.cxx |
| --- /google/src/files/a/depot//src/hunspell/suggestmgr.cxx 2013-07-24 23:12:12.000000000 -0400 |
| +++ /google/src/files/b/depot//src/hunspell/suggestmgr.cxx 2013-10-01 01:04:03.000000000 -0400 |
| @@ -155,10 +155,13 @@ |
| |
| if (utf8) { |
| wl = u8_u16(word_utf, MAXSWL, word); |
| - if (wl == -1) { |
| - *slst = wlst; |
| - return nsug; |
| - } |
| + // Added to handle wrong encoded UTF-8 strings - jiho@google.com |
| + if (wl <= 0) { |
| + if (!*slst) { |
| + free(wlst); |
| + } |
| + return -1; |
| + } |
| } |
| |
| for (int cpdsuggest=0; (cpdsuggest<2) && (nocompoundtwowords==0); cpdsuggest++) { |
| --- /google/src/files/a/depot//src/hunspell/affixmgr.cxx 2013-07-24 23:12:12.000000000 -0400 |
| +++ /google/src/files/b/depot//src/hunspell/affixmgr.cxx 2013-10-01 01:04:03.000000000 -0400 |
| @@ -8,6 +8,7 @@ |
| |
| #include <vector> |
| |
| +#include "base/scoped_ptr.h" |
| #include "affixmgr.hxx" |
| #include "affentry.hxx" |
| #include "langnum.hxx" |
| @@ -1364,9 +1365,14 @@ |
| // check compound patterns |
| int AffixMgr::defcpd_check(hentry *** words, short wnum, hentry * rv, hentry ** def, char all) |
| { |
| - signed short btpp[MAXWORDLEN]; // metacharacter (*, ?) positions for backtracking |
| - signed short btwp[MAXWORDLEN]; // word positions for metacharacters |
| - int btnum[MAXWORDLEN]; // number of matched characters in metacharacter positions |
| + // Note(jiho@google.com): Changed to use scoped_ptr to avoid 64KB stack size |
| + // problem. |
| + scoped_array<signed short> scoped_btpp(new signed short[MAXWORDLEN]); |
| + signed short * btpp = scoped_btpp.get(); // metacharacter (*, ?) positions for backtracking |
| + scoped_array<signed short> scoped_btwp(new signed short[MAXWORDLEN]); |
| + signed short * btwp = scoped_btwp.get(); // word positions for metacharacters |
| + scoped_array<int> scoped_btnum(new int[MAXWORDLEN]); |
| + int * btnum = scoped_btnum.get(); // number of matched characters in metacharacter positions |
| short bt = 0; |
| int i, j; |
| int ok; |
| @@ -1531,8 +1537,18 @@ |
| short oldnumsyllable, oldnumsyllable2, oldwordnum, oldwordnum2; |
| struct hentry * rv = NULL; |
| struct hentry * rv_first; |
| - struct hentry * rwords[MAXWORDLEN]; // buffer for COMPOUND pattern checking |
| - char st [MAXWORDUTF8LEN + 4]; |
| + |
| + // NOTE: This can not be a scoped_array because |
| + // "new hentry*[MAXWORDLEN]" is compiled to call malloc() which is not |
| + // compatible with scoped_ptr. |
| + // scoped_array<struct hentry*> rwords(new hentry*[MAXWORDLEN]); |
| + struct hentry ** rwords = // buffer for COMPOUND pattern checking |
| + (struct hentry**) malloc(sizeof(struct hentry*) * (MAXWORDLEN)); |
| + |
| + // Note(jiho@google.com): Changed to use scoped_ptr to avoid 64KB stack size |
| + // problem. |
| + scoped_array<char> scoped_st(new char[MAXWORDUTF8LEN + 4]); |
| + char * st = scoped_st.get(); |
| char ch = '\0'; |
| int cmin; |
| int cmax; |
| @@ -1557,7 +1573,10 @@ |
| // go to end of the UTF-8 character |
| if (utf8) { |
| for (; (st[i] & 0xc0) == 0x80; i++); |
| - if (i >= cmax) return NULL; |
| + if (i >= cmax) { |
| + free(rwords); |
| + return NULL; |
| + } |
| } |
| |
| words = oldwords; |
| @@ -1612,8 +1631,8 @@ |
| (compoundmiddle && wordnum && !words && !onlycpdrule && |
| TESTAFF(rv->astr, compoundmiddle, rv->alen)) || |
| (numdefcpd && onlycpdrule && |
| - ((!words && !wordnum && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)) || |
| - (words && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0))))) || |
| + ((!words && !wordnum && defcpd_check(&words, wnum, rv, rwords, 0)) || |
| + (words && defcpd_check(&words, wnum, rv, rwords, 0))))) || |
| (scpd != 0 && checkcpdtable[scpd-1].cond != FLAG_NULL && |
| !TESTAFF(rv->astr, checkcpdtable[scpd-1].cond, rv->alen))) |
| ) { |
| @@ -1693,6 +1712,7 @@ |
| if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || |
| TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || |
| (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) { |
| + free(rwords); |
| return NULL; |
| } |
| |
| @@ -1784,7 +1804,10 @@ |
| if (rv && forceucase && (rv) && |
| (TESTAFF(rv->astr, forceucase, rv->alen)) && !(info && *info & SPELL_ORIGCAP)) rv = NULL; |
| |
| - if (rv && words && words[wnum + 1]) return rv_first; |
| + if (rv && words && words[wnum + 1]) { |
| + free(rwords); |
| + return rv_first; |
| + } |
| |
| oldnumsyllable2 = numsyllable; |
| oldwordnum2 = wordnum; |
| @@ -1805,7 +1828,10 @@ |
| // check forbiddenwords |
| if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || |
| TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || |
| - (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) return NULL; |
| + (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) { |
| + free(rwords); |
| + return NULL; |
| + } |
| |
| // second word is acceptable, as a root? |
| // hungarian conventions: compounding is acceptable, |
| @@ -1833,6 +1859,7 @@ |
| TESTAFF(rv->astr, checkcpdtable[scpd-1].cond2, rv->alen)) |
| ) |
| { |
| + free(rwords); |
| // forbid compound word, if it is a non compound word with typical fault |
| if (checkcompoundrep && cpdrep_check(word,len)) return NULL; |
| return rv_first; |
| @@ -1853,7 +1880,10 @@ |
| |
| if (!rv && numdefcpd && words) { |
| rv = affix_check((word+i),strlen(word+i), 0, IN_CPD_END); |
| - if (rv && defcpd_check(&words, wnum + 1, rv, NULL, 1)) return rv_first; |
| + if (rv && defcpd_check(&words, wnum + 1, rv, NULL, 1)) { |
| + free(rwords); |
| + return rv_first; |
| + } |
| rv = NULL; |
| } |
| |
| @@ -1882,7 +1912,10 @@ |
| // check forbiddenwords |
| if ((rv) && (rv->astr) && (TESTAFF(rv->astr, forbiddenword, rv->alen) || |
| TESTAFF(rv->astr, ONLYUPCASEFLAG, rv->alen) || |
| - (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) return NULL; |
| + (is_sug && nosuggest && TESTAFF(rv->astr, nosuggest, rv->alen)))) { |
| + free(rwords); |
| + return NULL; |
| + } |
| |
| // pfxappnd = prefix of word+i, or NULL |
| // calculate syllable number of prefix. |
| @@ -1936,7 +1969,11 @@ |
| (!checkcompounddup || (rv != rv_first)) |
| )) { |
| // forbid compound word, if it is a non compound word with typical fault |
| - if (checkcompoundrep && cpdrep_check(word, len)) return NULL; |
| + if (checkcompoundrep && cpdrep_check(word, len)) { |
| + free(rwords); |
| + return NULL; |
| + } |
| + free(rwords); |
| return rv_first; |
| } |
| |
| @@ -1958,7 +1995,10 @@ |
| if (checkcompoundrep || forbiddenword) { |
| struct hentry * rv2 = NULL; |
| |
| - if (checkcompoundrep && cpdrep_check(word, len)) return NULL; |
| + if (checkcompoundrep && cpdrep_check(word, len)) { |
| + free(rwords); |
| + return NULL; |
| + } |
| |
| // check first part |
| if (strncmp(rv->word, word + i, rv->blen) == 0) { |
| @@ -1975,12 +2015,14 @@ |
| if (!rv2) rv2 = affix_check(word, len); |
| if (rv2 && rv2->astr && TESTAFF(rv2->astr, forbiddenword, rv2->alen) && |
| (strncmp(rv2->word, st, i + rv->blen) == 0)) { |
| + free(rwords); |
| return NULL; |
| } |
| } |
| *(st + i + rv->blen) = r; |
| } |
| } |
| + free(rwords); |
| return rv_first; |
| } |
| } while (striple && !checkedstriple); // end of striple loop |
| @@ -2019,6 +2061,7 @@ |
| |
| } |
| |
| + free(rwords); |
| return NULL; |
| } |
| |
| @@ -2034,8 +2077,13 @@ |
| |
| struct hentry * rv = NULL; |
| struct hentry * rv_first; |
| - struct hentry * rwords[MAXWORDLEN]; // buffer for COMPOUND pattern checking |
| - char st [MAXWORDUTF8LEN + 4]; |
| + // Note(jiho@google.com): Changed to use malloc to avoid stack overflow. |
| + struct hentry ** rwords = // buffer for COMPOUND pattern checking |
| + (struct hentry**) malloc(sizeof(struct hentry*) * (MAXWORDLEN)); |
| + // Note(jiho@google.com): Changed to use scoped_ptr to avoid 64KB stack size |
| + // problem. |
| + scoped_array<char> scoped_st(new char[MAXWORDUTF8LEN + 4]); |
| + char * st = scoped_st.get(); |
| char ch; |
| |
| int checked_prefix; |
| @@ -2060,7 +2108,10 @@ |
| // go to end of the UTF-8 character |
| if (utf8) { |
| for (; (st[i] & 0xc0) == 0x80; i++); |
| - if (i >= cmax) return 0; |
| + if (i >= cmax) { |
| + free(rwords); |
| + return NULL; |
| + } |
| } |
| |
| words = oldwords; |
| @@ -2094,8 +2145,8 @@ |
| (compoundmiddle && wordnum && !words && !onlycpdrule && |
| TESTAFF(rv->astr, compoundmiddle, rv->alen)) || |
| (numdefcpd && onlycpdrule && |
| - ((!words && !wordnum && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)) || |
| - (words && defcpd_check(&words, wnum, rv, (hentry **) &rwords, 0)))) |
| + ((!words && !wordnum && defcpd_check(&words, wnum, rv, rwords, 0)) || |
| + (words && defcpd_check(&words, wnum, rv, rwords, 0)))) |
| ))) { |
| rv = rv->next_homonym; |
| } |
| @@ -2289,6 +2340,7 @@ |
| } |
| mystrcat(*result, "\n", MAXLNLEN); |
| ok = 1; |
| + free(rwords); |
| return 0; |
| } |
| |
| @@ -2488,6 +2540,7 @@ |
| } while (numdefcpd && oldwordnum == 0 && !onlycpdrule && (onlycpdrule = 1)); // end of onlycpd loop |
| |
| } |
| + free(rwords); |
| return 0; |
| } |
| |