• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/logging.h"
6 #include "base/strings/old_utf_string_conversions.h"
7 #include "base/strings/utf_string_conversions.h"
8 
9 namespace {
10 
UTF8ToCheck(const uint8_t * data,size_t size)11 void UTF8ToCheck(const uint8_t* data, size_t size) {
12   const auto* src = reinterpret_cast<const char*>(data);
13   const size_t src_len = size;
14 
15   // UTF16
16   {
17     base::string16 new_out;
18     bool new_res = base::UTF8ToUTF16(src, src_len, &new_out);
19 
20     base::string16 old_out;
21     bool old_res = base_old::UTF8ToUTF16(src, src_len, &old_out);
22 
23     CHECK(new_res == old_res);
24     CHECK(new_out == old_out);
25   }
26 
27   // Wide
28   {
29     std::wstring new_out;
30     bool new_res = base::UTF8ToWide(src, src_len, &new_out);
31 
32     std::wstring old_out;
33     bool old_res = base_old::UTF8ToWide(src, src_len, &old_out);
34 
35     CHECK(new_res == old_res);
36     CHECK(new_out == old_out);
37   }
38 }
39 
UTF16ToCheck(const uint8_t * data,size_t size)40 void UTF16ToCheck(const uint8_t* data, size_t size) {
41   const auto* src = reinterpret_cast<const base::char16*>(data);
42   const size_t src_len = size / 2;
43 
44   // UTF8
45   {
46     std::string new_out;
47     bool new_res = base::UTF16ToUTF8(src, src_len, &new_out);
48 
49     std::string old_out;
50     bool old_res = base_old::UTF16ToUTF8(src, src_len, &old_out);
51 
52     CHECK(new_res == old_res);
53     CHECK(new_out == old_out);
54   }
55 
56   // Wide
57   {
58     std::wstring new_out;
59     bool new_res = base::UTF16ToWide(src, src_len, &new_out);
60 
61     std::wstring old_out;
62     bool old_res = base_old::UTF16ToWide(src, src_len, &old_out);
63 
64     CHECK(new_res == old_res);
65     CHECK(new_out == old_out);
66   }
67 }
68 
WideToCheck(const uint8_t * data,size_t size)69 void WideToCheck(const uint8_t* data, size_t size) {
70   const auto* src = reinterpret_cast<const wchar_t*>(data);
71   const size_t src_len = size / 4;  // It's OK even if Wide is 16bit.
72 
73   // UTF8
74   {
75     std::string new_out;
76     bool new_res = base::WideToUTF8(src, src_len, &new_out);
77 
78     std::string old_out;
79     bool old_res = base_old::WideToUTF8(src, src_len, &old_out);
80 
81     CHECK(new_res == old_res);
82     CHECK(new_out == old_out);
83   }
84 
85   // UTF16
86   {
87     base::string16 new_out;
88     bool new_res = base::WideToUTF16(src, src_len, &new_out);
89 
90     base::string16 old_out;
91     bool old_res = base_old::WideToUTF16(src, src_len, &old_out);
92 
93     CHECK(new_res == old_res);
94     CHECK(new_out == old_out);
95   }
96 }
97 
98 }  // namespace
99 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)100 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
101   UTF8ToCheck(data, size);
102   UTF16ToCheck(data, size);
103   WideToCheck(data, size);
104   return 0;
105 }
106