Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 25 additions & 17 deletions icu4c/source/test/fuzzer/date_format_fuzzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
};
int32_t numStyles = sizeof(styles) / sizeof(icu::DateFormat::EStyle);

icu::DateFormat::EStyle dateStyle;
icu::DateFormat::EStyle timeStyle;
if (size < sizeof(rnd) + sizeof(date) + 2*sizeof(rnd2) +
sizeof(dateStyle) + sizeof(timeStyle) ) {
if (size < sizeof(rnd) + sizeof(date) + 4*sizeof(uint8_t)) {
return 0;
}
icu::StringPiece fuzzData(reinterpret_cast<const char *>(data), size);
Expand All @@ -43,10 +40,15 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
fuzzData.remove_prefix(sizeof(rnd));
icu::Locale locale = GetRandomLocale(rnd);

std::memcpy(&dateStyle, fuzzData.data(), sizeof(dateStyle));
fuzzData.remove_prefix(sizeof(dateStyle));
std::memcpy(&timeStyle, fuzzData.data(), sizeof(timeStyle));
fuzzData.remove_prefix(sizeof(timeStyle));
// Use styles[] lookup with modulo for all style variables to avoid
// undefined behavior from loading invalid enum values.
std::memcpy(&rnd2, fuzzData.data(), sizeof(rnd2));
icu::DateFormat::EStyle dateStyle = styles[rnd2 % numStyles];
fuzzData.remove_prefix(sizeof(rnd2));

std::memcpy(&rnd2, fuzzData.data(), sizeof(rnd2));
icu::DateFormat::EStyle timeStyle = styles[rnd2 % numStyles];
fuzzData.remove_prefix(sizeof(rnd2));

std::memcpy(&rnd2, fuzzData.data(), sizeof(rnd2));
icu::DateFormat::EStyle dateStyle2 = styles[rnd2 % numStyles];
Expand All @@ -61,26 +63,31 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

std::unique_ptr<icu::DateFormat> df(
icu::DateFormat::createDateTimeInstance(dateStyle, timeStyle, locale));
icu::UnicodeString appendTo;
df->format(date, appendTo);
if (df) {
icu::UnicodeString appendTo;
df->format(date, appendTo);
}

df.reset(
icu::DateFormat::createDateTimeInstance(dateStyle2, timeStyle2, locale));
appendTo.remove();
df->format(date, appendTo);
if (df) {
icu::UnicodeString appendTo;
df->format(date, appendTo);
}

icu::UnicodeString skeleton = icu::UnicodeString::fromUTF8(fuzzData);

UErrorCode status = U_ZERO_ERROR;
appendTo.remove();
df.reset(icu::DateFormat::createInstanceForSkeleton(skeleton, status));
if (U_SUCCESS(status)) {
if (U_SUCCESS(status) && df) {
icu::UnicodeString appendTo;
df->format(date, appendTo);
}

status = U_ZERO_ERROR;
appendTo.remove();
df.reset(icu::DateFormat::createInstanceForSkeleton(skeleton, locale, status));
if (U_SUCCESS(status)) {
if (U_SUCCESS(status) && df) {
icu::UnicodeString appendTo;
df->format(date, appendTo);
}

Expand All @@ -91,10 +98,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
df.reset(
icu::DateFormat::createDateTimeInstance(dateStyle2, timeStyle2, locale2));

status = U_ZERO_ERROR;
UDateFormat* udf = udat_open(UDAT_PATTERN, UDAT_PATTERN, str.c_str(), nullptr, 0,
skeleton.getBuffer(), skeleton.length(), &status);
if (udf && U_SUCCESS(status)) {
udat_close(udf);
}
return EXIT_SUCCESS;
return 0;
}