blob: e07d2dd4a1e9e0b70649a4be4a8522be66ac0c0d [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Fuzzer for toLower/toUpper
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include "third_party/icu/fuzzers/fuzzer_utils.h"
#include "third_party/icu/source/common/unicode/ustring.h"
IcuEnvironment* env = new IcuEnvironment();
template <typename T>
using deleted_unique_ptr = std::unique_ptr<T, std::function<void(T*)>>;
// Most locale case convert the same, but we know ICU case convert are different
// of the below five
static const std::array<const char*, 5> kCaseLocales = {{
"en", // root
"el", // Greek
"tr", // Turkish
"lt", // Lithuanian
"nl", // Dutch
}};
// Entry point for LibFuzzer.
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
UErrorCode status = U_ZERO_ERROR;
icu::UnicodeString str(UnicodeStringFromUtf32(data, size));
auto rng = CreateRng(data, size);
const char* locale = kCaseLocales[rng() % kCaseLocales.size()];
// Make the dest_size randomly fall in [0, strlen+3]
int32_t dest_size = (rng() % (str.length() + 3));
std::unique_ptr<UChar[]> dest(new UChar[dest_size]);
switch (rng() % 2) {
case 0:
u_strToUpper(dest.get(), dest_size, (const UChar*)str.getBuffer(),
str.length(), locale, &status);
break;
case 1:
u_strToLower(dest.get(), dest_size, (const UChar*)str.getBuffer(),
str.length(), locale, &status);
break;
}
return 0;
}