ICU-22509 Fix the RelativeDateFormat to reject unsupported dateStyle

This commit is contained in:
Frank Tang 2023-09-19 17:12:28 -07:00 committed by Frank Yung-Fong Tang
parent f4227f5d54
commit 87d606c39a
2 changed files with 26 additions and 3 deletions

View file

@ -78,6 +78,14 @@ RelativeDateFormat::RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatS
if(U_FAILURE(status) ) {
return;
}
if (dateStyle != UDAT_FULL_RELATIVE &&
dateStyle != UDAT_LONG_RELATIVE &&
dateStyle != UDAT_MEDIUM_RELATIVE &&
dateStyle != UDAT_SHORT_RELATIVE &&
dateStyle != UDAT_RELATIVE) {
status = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
if (timeStyle < UDAT_NONE || timeStyle > UDAT_SHORT) {
// don't support other time styles (e.g. relative styles), for now

View file

@ -31,19 +31,29 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
};
int32_t numStyles = sizeof(styles) / sizeof(icu::DateFormat::EStyle);
if (size < sizeof(rnd) + sizeof(date) + 2*sizeof(rnd2)) return 0;
icu::DateFormat::EStyle dateStyle;
icu::DateFormat::EStyle timeStyle;
if (size < sizeof(rnd) + sizeof(date) + 2*sizeof(rnd2) +
sizeof(dateStyle) + sizeof(timeStyle) ) {
return 0;
}
icu::StringPiece fuzzData(reinterpret_cast<const char *>(data), size);
std::memcpy(&rnd, fuzzData.data(), sizeof(rnd));
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));
std::memcpy(&rnd2, fuzzData.data(), sizeof(rnd2));
icu::DateFormat::EStyle dateStyle = styles[rnd2 % numStyles];
icu::DateFormat::EStyle dateStyle2 = styles[rnd2 % numStyles];
fuzzData.remove_prefix(sizeof(rnd2));
std::memcpy(&rnd2, fuzzData.data(), sizeof(rnd2));
icu::DateFormat::EStyle timeStyle = styles[rnd2 % numStyles];
icu::DateFormat::EStyle timeStyle2 = styles[rnd2 % numStyles];
fuzzData.remove_prefix(sizeof(rnd2));
std::memcpy(&date, fuzzData.data(), sizeof(date));
@ -53,6 +63,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
icu::DateFormat::createDateTimeInstance(dateStyle, timeStyle, locale));
icu::UnicodeString appendTo;
df->format(date, appendTo);
df.reset(
icu::DateFormat::createDateTimeInstance(dateStyle2, timeStyle2, locale));
appendTo.remove();
df->format(date, appendTo);
icu::UnicodeString skeleton = icu::UnicodeString::fromUTF8(fuzzData);
UErrorCode status = U_ZERO_ERROR;