ICU-22716 Add uregex_match_fuzzer

Based on https://chromium-review.googlesource.com/c/chromium/deps/icu/+/5465572
This commit is contained in:
Frank Tang 2024-06-17 15:32:40 -07:00 committed by Frank Yung-Fong Tang
parent 0ea487a58b
commit e5b8660a46
2 changed files with 37 additions and 0 deletions

View file

@ -61,6 +61,7 @@ FUZZER_TARGETS = \
unicode_string_codepage_create_fuzzer \
uprop_fuzzer \
uregex_open_fuzzer \
uregex_match_fuzzer \
OBJECTS = $(FUZZER_TARGETS:%=%.o)

View file

@ -0,0 +1,36 @@
// © 2024 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
#include <cstring>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include "fuzzer_utils.h"
#include "unicode/regex.h"
IcuEnvironment* env = new IcuEnvironment();
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
UParseError pe = { 0 };
UErrorCode status = U_ZERO_ERROR;
size_t unistr_size = size/2;
std::unique_ptr<char16_t[]> fuzzbuff(new char16_t[unistr_size]);
std::memcpy(fuzzbuff.get(), data, unistr_size * 2);
icu::UnicodeString fuzzstr(false, fuzzbuff.get(), unistr_size);
icu::UnicodeString regex = fuzzstr.tempSubString (0, fuzzstr.length() / 4);
icu::UnicodeString haystack = fuzzstr.tempSubString (regex.length());
std::unique_ptr<icu::RegexPattern> re(icu::RegexPattern::compile(regex, UREGEX_CASE_INSENSITIVE, status));
if (U_FAILURE(status)) {
return -1; // invalid regex, don't explore further
}
std::unique_ptr<icu::RegexMatcher> regex_matcher(re->matcher(haystack, status));
if (U_SUCCESS(status)) {
regex_matcher->find(0, status);
}
return 0;
}