|  | Change 537915601 by sungyc@sungyc:fig-export-icing-153-change-350:5488:citc on 2023/06/05 10:29:15 | 
|  |  | 
|  | [hunspell] Safe integer check for phone->num to prevent overflow | 
|  |  | 
|  | ## Test plan | 
|  | ``` | 
|  | sso_client -location 'https://clusterfuzz.corp.google.com/testcase-detail/download-testcase?id=5179437376995328' > /tmp/testcase-5179437376995328 && \ | 
|  | blaze --blazerc=/dev/null test -c opt --config=asan-fuzzer --test_strategy=local --test_sharding_strategy=disabled \ | 
|  | --test_env=ENABLE_BLAZE_TEST_FUZZING=1  --test_arg=-runs=100 --test_arg=/tmp/testcase-5179437376995328 \ | 
|  | //third_party/hunspell/fuzzers:dict_fuzzer | 
|  | ``` | 
|  |  | 
|  | ## Description | 
|  | - We malloc memory with size = `2 * (phone->num + 1) * sizeof(char *)` for `phone->rules`. | 
|  | - If `phone->num` is too large, then it will cause integer overflow. | 
|  |  | 
|  | Change `phone->num` check in L3769 to prevent overflow. Also free `phone` before returning error to prevent memory leak. | 
|  |  | 
|  | PRESUBMIT=passed | 
|  | BUG=280278127 | 
|  | R=mghiware | 
|  | APPROVED=mghiware | 
|  | REQUIRED_REVIEW=1 | 
|  | DELTA=15 (7 added, 4 deleted, 4 changed) | 
|  | DELTA_BY_EXTENSION=cxx=11 | 
|  | OCL=537406342 | 
|  | FIG_CHANGESET=b89f41211e07c7f574813ec124d9743a7c505e10 | 
|  | FIG_WORKSPACE=sungyc/153:icing | 
|  | MARKDOWN=true | 
|  |  | 
|  | Affected files ... | 
|  |  | 
|  | ... //depot//src/hunspell/affixmgr.cxx#12 edit | 
|  |  | 
|  | ==== //depot//src/hunspell/affixmgr.cxx#11 - /google/src/files/537915601/depot//src/hunspell/affixmgr.cxx ==== | 
|  | --- /google/src/files/537395995/depot//src/hunspell/affixmgr.cxx	2023-06-02 16:30:25.000000000 -0400 | 
|  | +++ /google/src/files/537915601/depot//src/hunspell/affixmgr.cxx	2023-06-05 13:29:15.000000000 -0400 | 
|  | @@ -1,19 +1,19 @@ | 
|  | -#include "license.hunspell" | 
|  | -#include "license.myspell" | 
|  | +#include "affixmgr.hxx" | 
|  |  | 
|  | +#include <ctype.h> | 
|  | +#include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | -#include <stdio.h> | 
|  | -#include <ctype.h> | 
|  |  | 
|  | +#include <limits> | 
|  | #include <memory> | 
|  | #include <vector> | 
|  |  | 
|  | -#include "affixmgr.hxx" | 
|  | #include "affentry.hxx" | 
|  | -#include "langnum.hxx" | 
|  | - | 
|  | #include "csutil.hxx" | 
|  | +#include "langnum.hxx" | 
|  | +#include "license.hunspell" | 
|  | +#include "license.myspell" | 
|  |  | 
|  | AffixMgr::AffixMgr(const char * affpath, HashMgr** ptr, int * md, const char * key) | 
|  | { | 
|  | @@ -3766,8 +3766,11 @@ | 
|  | phone->num = atoi(piece); | 
|  | phone->rules = NULL; | 
|  | phone->utf8 = (char) utf8; | 
|  | -                       if (phone->num < 1) { | 
|  | +                       if (phone->num < 1 || | 
|  | +                           phone->num > std::numeric_limits<int>::max() / (2 * sizeof(char *)) - 1) { | 
|  | HUNSPELL_WARNING(stderr, "error: line %d: bad entry number\n", af->getlinenum()); | 
|  | +                          free(phone); | 
|  | +                          phone = NULL; | 
|  | return 1; | 
|  | } | 
|  | phone->rules = (char * *) malloc(2 * (phone->num + 1) * sizeof(char *)); |