diff --git a/icu4c/source/test/fuzzer/break_iterator_fuzzer.cpp b/icu4c/source/test/fuzzer/break_iterator_fuzzer.cpp index 0135b3219560..ca8ef5d256b2 100644 --- a/icu4c/source/test/fuzzer/break_iterator_fuzzer.cpp +++ b/icu4c/source/test/fuzzer/break_iterator_fuzzer.cpp @@ -31,6 +31,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { std::memcpy(fuzzbuff.get(), data, unistr_size * 2); UText* fuzzstr = utext_openUChars(nullptr, fuzzbuff.get(), unistr_size, &status); + if (U_FAILURE(status) || fuzzstr == nullptr) { + return 0; + } const icu::Locale& locale = GetRandomLocale(rnd16); @@ -54,6 +57,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { break; } + if (bi == nullptr || U_FAILURE(status)) { + utext_close(fuzzstr); + return 0; + } + bi->setText(fuzzstr, status); if (U_FAILURE(status)) { @@ -65,6 +73,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { utext_close(fuzzstr); + // Reset status before second round of BreakIterator creation. + status = U_ZERO_ERROR; + std::string str(reinterpret_cast(data), size); icu::Locale locale2(str.c_str()); // ensure null-termination by c_str() switch (rnd8 % 5) {