Index: third_party/hunspell/fuzz/hunspell_fuzzer.cc |
diff --git a/third_party/hunspell/fuzz/hunspell_fuzzer.cc b/third_party/hunspell/fuzz/hunspell_fuzzer.cc |
index cf125267e45ed9ec38d212e798ee86887b2a4e7b..df26b8574ef23763271e90137182b3d27bb94339 100644 |
--- a/third_party/hunspell/fuzz/hunspell_fuzzer.cc |
+++ b/third_party/hunspell/fuzz/hunspell_fuzzer.cc |
@@ -6,6 +6,8 @@ |
#include <stdint.h> |
#include <string> |
+#include "base/strings/string16.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "third_party/hunspell/src/hunspell/hunspell.hxx" |
#include "third_party/hunspell/fuzz/hunspell_fuzzer_hunspell_dictionary.h" |
@@ -18,11 +20,17 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
sizeof(kHunspellDictionary)); |
std::string data_string(reinterpret_cast<const char*>(data), size); |
+ |
+ // hunspell is not handling invalid UTF8. To avoid that, do the same thing |
+ // Chromium does - convert to UTF16, and back to UTF8. Valid UTF8 guaranteed. |
+ base::string16 utf16_string = base::UTF8ToUTF16(data_string); |
+ data_string = base::UTF16ToUTF8(utf16_string); |
+ |
hunspell->spell(data_string.c_str()); |
char** suggestions = nullptr; |
- int suggetion_length = hunspell->suggest(&suggestions, data_string.c_str()); |
- hunspell->free_list(&suggestions, suggetion_length); |
+ int suggestion_length = hunspell->suggest(&suggestions, data_string.c_str()); |
+ hunspell->free_list(&suggestions, suggestion_length); |
return 0; |
} |