| Change 613323525 by sungyc@sungyc:fig-export-icing-153-change-473:7348:citc on 2024/03/06 13:30:53 |
| |
| [hunspell][vulnerability fix] Use calloc to initialize all allocated bytes to 0 |
| |
| ## Test plan |
| ``` |
| sso_client -location 'https://clusterfuzz.corp.google.com/testcase-detail/download-testcase?id=5038681210028032' > /tmp/testcase-5038681210028032 && \ |
| blaze --blazerc=/dev/null test -c opt --config=fuzztest --copt=-DNDEBUG \ |
| --test_strategy=local \ |
| --test_sharding_strategy=disabled \ |
| --test_env=FUZZTEST_REPLAY=/tmp/testcase-5038681210028032 \ |
| --test_filter=LLVMFuzzer.TestOneInput \ |
| //third_party/hunspell/fuzzers:dict_fuzzer |
| ``` |
| |
| ## Description |
| - The element in `defcpdtable` contains a pointer to another `malloc` buffer. |
| - `defcpdtable` is not initialized (or partially initialized) after `malloc`. The pointer may still contain an invalid non-null value, so `free_defcpdtable` calls `free` with an invalid address and causes error. |
| |
| By switching to `calloc`, all bytes are initialized to 0, so the pointer is initialized as `NULL`. Then later `free_defcpdtable` will skip NULL pointer freeing correctly. |
| |
| PRESUBMIT=passed |
| BUG=325538748 |
| R=mghiware |
| APPROVED=mghiware |
| REQUIRED_REVIEW=1 |
| DELTA=1 (0 added, 0 deleted, 1 changed) |
| DELTA_BY_EXTENSION=cxx=1 |
| OCL=612537516 |
| DIFFBASE=612513824 |
| FIG_CHANGESET=0f4c956db8114c22bca3683d2087fd101d3ddc8f |
| FIG_WORKSPACE=sungyc/153:icing |
| MARKDOWN=true |
| |
| Affected files ... |
| |
| ... //depot//src/hunspell/affixmgr.cxx#17 edit |
| |
| ==== //depot//src/hunspell/affixmgr.cxx#16 - /google/src/files/613323525/depot//src/hunspell/affixmgr.cxx ==== |
| --- /google/src/files/613323179/depot//src/hunspell/affixmgr.cxx 2024-03-06 16:29:53.000000000 -0500 |
| +++ /google/src/files/613323525/depot//src/hunspell/affixmgr.cxx 2024-03-06 16:30:53.000000000 -0500 |
| @@ -3965,7 +3965,7 @@ |
| HUNSPELL_WARNING(stderr, "error: line %d: bad entry number\n", af->getlinenum()); |
| return 1; |
| } |
| - defcpdtable = (flagentry *) malloc(numdefcpd * sizeof(flagentry)); |
| + defcpdtable = (flagentry *) calloc(numdefcpd, sizeof(flagentry)); |
| if (!defcpdtable) { |
| free_defcpdtable(); |
| return 1; |