Skip to content

Commit c866dfc

Browse files
authored
Prevent timeout fault running PatternConverterFuzzer (#481)
1 parent a1a46c3 commit c866dfc

File tree

1 file changed

+65
-92
lines changed

1 file changed

+65
-92
lines changed

src/fuzzers/cpp/PatternConverterFuzzer.cpp

Lines changed: 65 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,11 @@
1515
* limitations under the License.
1616
*/
1717

18-
#include "stdint.h"
19-
#include <log4cxx/nt/nteventlogappender.h>
20-
#include <log4cxx/logstring.h>
21-
#include <log4cxx/helpers/stringhelper.h>
2218
#include <fuzzer/FuzzedDataProvider.h>
23-
#include <log4cxx/pattern/patternconverter.h>
19+
#include <log4cxx/spi/loggingevent.h>
2420
#include <log4cxx/helpers/transcoder.h>
2521

22+
#include <log4cxx/pattern/patternconverter.h>
2623
#include <log4cxx/pattern/loggerpatternconverter.h>
2724
#include <log4cxx/pattern/literalpatternconverter.h>
2825
#include <log4cxx/pattern/classnamepatternconverter.h>
@@ -43,29 +40,25 @@
4340
#include <log4cxx/pattern/throwableinformationpatternconverter.h>
4441
#include <log4cxx/pattern/threadusernamepatternconverter.h>
4542

43+
namespace
44+
{
45+
const int MaximumOptionByteCount = 1000;
46+
const int MaximumNameByteCount = 100;
47+
}
48+
4649
using namespace log4cxx;
4750
using namespace log4cxx::helpers;
4851
using namespace log4cxx::spi;
4952
using namespace log4cxx::pattern;
5053

51-
#if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR_T
52-
wchar_t* wencode(const std::string& src, Pool& p)
53-
{
54-
wchar_t* dst = (wchar_t*) p.palloc((src.length() + 1) * sizeof(wchar_t));
55-
dst[src.length()] = 0;
56-
std::memcpy(dst, src.data(), src.length() * sizeof(wchar_t));
57-
return dst;
58-
}
59-
#endif
60-
6154
// Creates options from the FuzzedDataProvider
62-
std::vector<log4cxx::LogString> createOptions(FuzzedDataProvider* fdp) {
63-
std::string opt1Str = fdp->ConsumeRandomLengthString();
64-
std::string opt2Str = fdp->ConsumeRandomLengthString();
65-
std::string opt3Str = fdp->ConsumeRandomLengthString();
66-
std::string opt4Str = fdp->ConsumeRandomLengthString();
67-
std::string opt5Str = fdp->ConsumeRandomLengthString();
68-
55+
auto createOptions(FuzzedDataProvider* fdp) {
56+
auto opt1Str = fdp->ConsumeRandomLengthString(MaximumOptionByteCount);
57+
auto opt2Str = fdp->ConsumeRandomLengthString(MaximumOptionByteCount);
58+
auto opt3Str = fdp->ConsumeRandomLengthString(MaximumOptionByteCount);
59+
auto opt4Str = fdp->ConsumeRandomLengthString(MaximumOptionByteCount);
60+
auto opt5Str = fdp->ConsumeRandomLengthString(MaximumOptionByteCount);
61+
6962
LogString opt1, opt2, opt3, opt4, opt5;
7063

7164
Transcoder::decode(opt1Str, opt1);
@@ -74,121 +67,101 @@ std::vector<log4cxx::LogString> createOptions(FuzzedDataProvider* fdp) {
7467
Transcoder::decode(opt4Str, opt4);
7568
Transcoder::decode(opt5Str, opt5);
7669

77-
std::vector<log4cxx::LogString> options =
78-
{ opt1
79-
, opt2
80-
, opt3
81-
, opt4
82-
, opt5
83-
};
84-
return options;
70+
return std::vector<LogString>
71+
{ opt1
72+
, opt2
73+
, opt3
74+
, opt4
75+
, opt5
76+
};
8577
}
78+
8679
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
8780
// Create a FuzzedDataProvider which we will use to
8881
// create strings from "data".
8982
FuzzedDataProvider fdp(data, size);
90-
91-
std::string loggerStr = fdp.ConsumeRandomLengthString();
92-
std::string contentStr = fdp.ConsumeRandomLengthString();
93-
83+
84+
auto loggerStr = fdp.ConsumeRandomLengthString();
85+
auto contentStr = fdp.ConsumeRandomLengthString();
86+
9487
LogString logger, content;
9588
Transcoder::decode(loggerStr, logger);
9689
Transcoder::decode(contentStr, content);
9790

9891
// Create the event
99-
LevelPtr level = Level::getInfo();
92+
auto level = Level::getInfo();
10093

10194
Pool p;
10295

103-
log4cxx::spi::LoggingEventPtr event = log4cxx::spi::LoggingEventPtr(
104-
new log4cxx::spi::LoggingEvent(
105-
logger, level, content, LOG4CXX_LOCATION));
96+
auto event = std::make_shared<LoggingEvent>(
97+
logger, level, content, LOG4CXX_LOCATION);
10698
// Select a converter and invoke it.
10799
switch(fdp.ConsumeIntegralInRange<int>(0, 14)) {
108100
case 0: {
109-
std::string str1 = fdp.ConsumeRandomLengthString();
110-
std::string str2 = fdp.ConsumeRandomLengthString();
111-
LogString a1, a2;
112-
Transcoder::decode(str1, a1);
113-
Transcoder::decode(str2, a2);
101+
auto nameStr = fdp.ConsumeRandomLengthString(MaximumNameByteCount);
102+
auto opionStr = fdp.ConsumeRandomLengthString(MaximumOptionByteCount);
103+
LogString name, option;
104+
Transcoder::decode(nameStr, name);
105+
Transcoder::decode(opionStr, option);
114106

115-
PropertiesPatternConverter* converter = new PropertiesPatternConverter(a1, a2);
116-
converter->format(event, logger, p);
117-
delete converter;
107+
PropertiesPatternConverter(name, option).format(event, logger, p);
108+
break;
118109
}
119110
case 1: {
120-
std::vector<log4cxx::LogString> options = createOptions(&fdp);
121-
LoggerPatternConverter* converter = new LoggerPatternConverter(options);
122-
converter->format(event, logger, p);
123-
delete converter;
111+
LoggerPatternConverter(createOptions(&fdp)).format(event, logger, p);
112+
break;
124113
}
125114
case 2: {
126-
std::vector<log4cxx::LogString> options = createOptions(&fdp);
127-
ClassNamePatternConverter* converter = new ClassNamePatternConverter(options);
128-
converter->format(event, logger, p);
129-
delete converter;
115+
ClassNamePatternConverter(createOptions(&fdp)).format(event, logger, p);
116+
break;
130117
}
131118
case 3: {
132-
std::vector<log4cxx::LogString> options = createOptions(&fdp);
133-
DatePatternConverter* converter = new DatePatternConverter(options);
134-
converter->format(event, logger, p);
135-
delete converter;
119+
DatePatternConverter(createOptions(&fdp)).format(event, logger, p);
120+
break;
136121
}
137122
case 4: {
138-
FullLocationPatternConverter* converter = new FullLocationPatternConverter();
139-
converter->format(event, logger, p);
140-
delete converter;
123+
FullLocationPatternConverter().format(event, logger, p);
124+
break;
141125
}
142126
case 5: {
143-
LineLocationPatternConverter* converter = new LineLocationPatternConverter();
144-
converter->format(event, logger, p);
145-
delete converter;
127+
LineLocationPatternConverter().format(event, logger, p);
128+
break;
146129
}
147130
case 6: {
148-
MessagePatternConverter* converter = new MessagePatternConverter();
149-
converter->format(event, logger, p);
150-
delete converter;
131+
MessagePatternConverter().format(event, logger, p);
132+
break;
151133
}
152134
case 7: {
153-
LineSeparatorPatternConverter* converter = new LineSeparatorPatternConverter();
154-
converter->format(event, logger, p);
155-
delete converter;
135+
LineSeparatorPatternConverter().format(event, logger, p);
136+
break;
156137
}
157138
case 8: {
158-
MethodLocationPatternConverter* converter = new MethodLocationPatternConverter();
159-
converter->format(event, logger, p);
160-
delete converter;
139+
MethodLocationPatternConverter().format(event, logger, p);
140+
break;
161141
}
162142
case 9: {
163-
LevelPatternConverter* converter = new LevelPatternConverter();
164-
converter->format(event, logger, p);
165-
delete converter;
143+
LevelPatternConverter().format(event, logger, p);
166144
}
167145
case 10: {
168-
RelativeTimePatternConverter* converter = new RelativeTimePatternConverter();
169-
converter->format(event, logger, p);
170-
delete converter;
146+
RelativeTimePatternConverter().format(event, logger, p);
147+
break;
171148
}
172149
case 11: {
173-
ThreadPatternConverter* converter = new ThreadPatternConverter();
174-
converter->format(event, logger, p);
175-
delete converter;
150+
ThreadPatternConverter().format(event, logger, p);
151+
break;
176152
}
177153
case 12: {
178-
ThreadUsernamePatternConverter* converter = new ThreadUsernamePatternConverter();
179-
converter->format(event, logger, p);
180-
delete converter;
154+
ThreadUsernamePatternConverter().format(event, logger, p);
155+
break;
181156
}
182157
case 13: {
183-
NDCPatternConverter* converter = new NDCPatternConverter();
184-
converter->format(event, logger, p);
185-
delete converter;
158+
NDCPatternConverter().format(event, logger, p);
159+
break;
186160
}
187161
case 14: {
188-
ThrowableInformationPatternConverter* converter = new ThrowableInformationPatternConverter(fdp.ConsumeBool());
189-
converter->format(event, logger, p);
190-
delete converter;
162+
ThrowableInformationPatternConverter(fdp.ConsumeBool()).format(event, logger, p);
163+
break;
191164
}
192165
}
193-
return 0;
166+
return 0;
194167
}

0 commit comments

Comments
 (0)