| Change 613323179 by sungyc@sungyc:fig-export-icing-153-change-472:7338:citc on 2024/03/06 13:29:53 |
| |
| [hunspell][vulnerability fix] Add index boundary check to avoid buffer overflow or use-of-uninitialized-value error |
| ## Test plan |
| ``` |
| sso_client -location 'https://clusterfuzz.corp.google.com/testcase-detail/download-testcase?id=5674120459649024' > /tmp/testcase-5674120459649024 && \ |
| blaze --blazerc=/dev/null test --config=fuzztest-msan \ |
| --test_strategy=local \ |
| --test_sharding_strategy=disabled \ |
| --test_env=FUZZTEST_REPLAY=/tmp/testcase-5674120459649024 \ |
| --test_filter=LLVMFuzzer.TestOneInput \ |
| //third_party/hunspell/fuzzers:suggestions_fuzzer |
| ``` |
| |
| ## Description |
| When setting `cmin` and `cmax`, it is possible that they go out of bound (not in range `[0, len - 1]`), which may potentially cause buffer overflow error, or using uninitialized value of `word[*cmin]`/`word[*cmax]`. |
| |
| PRESUBMIT=passed |
| BUG=326368180 |
| R=mghiware |
| APPROVED=mghiware |
| REQUIRED_REVIEW=1 |
| DELTA=4 (0 added, 0 deleted, 4 changed) |
| DELTA_BY_EXTENSION=cxx=4 |
| OCL=612513824 |
| FIG_CHANGESET=318a0cff97e309dceb0197b75cce97b385d4a968 |
| FIG_WORKSPACE=sungyc/153:icing |
| MARKDOWN=true |
| |
| Affected files ... |
| |
| ... //depot//src/hunspell/affixmgr.cxx#16 edit |
| |
| ==== //depot//src/hunspell/affixmgr.cxx#15 - /google/src/files/613323179/depot//src/hunspell/affixmgr.cxx ==== |
| --- /google/src/files/583480615/depot//src/hunspell/affixmgr.cxx 2023-11-17 16:59:58.000000000 -0500 |
| +++ /google/src/files/613323179/depot//src/hunspell/affixmgr.cxx 2024-03-06 16:29:53.000000000 -0500 |
| @@ -1508,11 +1508,11 @@ |
| void AffixMgr::setcminmax(int * cmin, int * cmax, const char * word, int len) { |
| if (utf8) { |
| int i; |
| - for (*cmin = 0, i = 0; (i < cpdmin) && word[*cmin]; i++) { |
| - for ((*cmin)++; (word[*cmin] & 0xc0) == 0x80; (*cmin)++); |
| + for (*cmin = 0, i = 0; (i < cpdmin) && *cmin < len && word[*cmin]; i++) { |
| + for ((*cmin)++; *cmin < len && (word[*cmin] & 0xc0) == 0x80; (*cmin)++); |
| } |
| - for (*cmax = len, i = 0; (i < (cpdmin - 1)) && *cmax; i++) { |
| - for ((*cmax)--; (word[*cmax] & 0xc0) == 0x80; (*cmax)--); |
| + for (*cmax = len, i = 0; (i < (cpdmin - 1)) && *cmax > 0; i++) { |
| + for ((*cmax)--; *cmax > 0 && (word[*cmax] & 0xc0) == 0x80; (*cmax)--); |
| } |
| } else { |
| *cmin = cpdmin; |