##// END OF EJS Templates
fuzz: new target to fuzz jsonescapeu8fast...
Augie Fackler -
r43423:741fb1a9 default
parent child Browse files
Show More
@@ -0,0 +1,57 b''
1 #include <Python.h>
2 #include <assert.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5
6 #include "pyutil.h"
7
8 #include <fuzzer/FuzzedDataProvider.h>
9 #include <iostream>
10 #include <string>
11
12 extern "C" {
13
14 static PyCodeObject *code;
15
16 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
17 {
18 contrib::initpy(*argv[0]);
19 code = (PyCodeObject *)Py_CompileString(R"py(
20 from parsers import jsonescapeu8fast
21
22 try:
23 jsonescapeu8fast(data, paranoid)
24 except Exception as e:
25 pass
26 # uncomment this print if you're editing this Python code
27 # to debug failures.
28 # print(e)
29 )py",
30 "fuzzer", Py_file_input);
31 if (!code) {
32 std::cerr << "failed to compile Python code!" << std::endl;
33 }
34 return 0;
35 }
36
37 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
38 {
39 FuzzedDataProvider provider(Data, Size);
40 bool paranoid = provider.ConsumeBool();
41 std::string remainder = provider.ConsumeRemainingBytesAsString();
42
43 PyObject *mtext = PyBytes_FromStringAndSize(
44 (const char *)remainder.c_str(), remainder.size());
45 PyObject *locals = PyDict_New();
46 PyDict_SetItemString(locals, "data", mtext);
47 PyDict_SetItemString(locals, "paranoid", paranoid ? Py_True : Py_False);
48 PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
49 if (!res) {
50 PyErr_Print();
51 }
52 Py_XDECREF(res);
53 Py_DECREF(locals);
54 Py_DECREF(mtext);
55 return 0; // Non-zero return values are reserved for future use.
56 }
57 }
@@ -1,176 +1,184 b''
1 CC = clang
1 CC = clang
2 CXX = clang++
2 CXX = clang++
3
3
4 all: bdiff mpatch xdiff
4 all: bdiff mpatch xdiff
5
5
6 fuzzutil.o: fuzzutil.cc fuzzutil.h
6 fuzzutil.o: fuzzutil.cc fuzzutil.h
7 $(CXX) $(CXXFLAGS) -g -O1 \
7 $(CXX) $(CXXFLAGS) -g -O1 \
8 -std=c++17 \
8 -std=c++17 \
9 -I../../mercurial -c -o fuzzutil.o fuzzutil.cc
9 -I../../mercurial -c -o fuzzutil.o fuzzutil.cc
10
10
11 fuzzutil-oss-fuzz.o: fuzzutil.cc fuzzutil.h
11 fuzzutil-oss-fuzz.o: fuzzutil.cc fuzzutil.h
12 $(CXX) $(CXXFLAGS) -std=c++17 \
12 $(CXX) $(CXXFLAGS) -std=c++17 \
13 -I../../mercurial -c -o fuzzutil-oss-fuzz.o fuzzutil.cc
13 -I../../mercurial -c -o fuzzutil-oss-fuzz.o fuzzutil.cc
14
14
15 pyutil.o: pyutil.cc pyutil.h
15 pyutil.o: pyutil.cc pyutil.h
16 $(CXX) $(CXXFLAGS) -g -O1 \
16 $(CXX) $(CXXFLAGS) -g -O1 \
17 `$$OUT/sanpy/bin/python-config --cflags` \
17 `$$OUT/sanpy/bin/python-config --cflags` \
18 -I../../mercurial -c -o pyutil.o pyutil.cc
18 -I../../mercurial -c -o pyutil.o pyutil.cc
19
19
20 bdiff.o: ../../mercurial/bdiff.c
20 bdiff.o: ../../mercurial/bdiff.c
21 $(CC) $(CFLAGS) -fsanitize=fuzzer-no-link,address -c -o bdiff.o \
21 $(CC) $(CFLAGS) -fsanitize=fuzzer-no-link,address -c -o bdiff.o \
22 ../../mercurial/bdiff.c
22 ../../mercurial/bdiff.c
23
23
24 bdiff: bdiff.cc bdiff.o fuzzutil.o
24 bdiff: bdiff.cc bdiff.o fuzzutil.o
25 $(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
25 $(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
26 -std=c++17 \
26 -std=c++17 \
27 -I../../mercurial bdiff.cc bdiff.o fuzzutil.o -o bdiff
27 -I../../mercurial bdiff.cc bdiff.o fuzzutil.o -o bdiff
28
28
29 bdiff-oss-fuzz.o: ../../mercurial/bdiff.c
29 bdiff-oss-fuzz.o: ../../mercurial/bdiff.c
30 $(CC) $(CFLAGS) -c -o bdiff-oss-fuzz.o ../../mercurial/bdiff.c
30 $(CC) $(CFLAGS) -c -o bdiff-oss-fuzz.o ../../mercurial/bdiff.c
31
31
32 bdiff_fuzzer: bdiff.cc bdiff-oss-fuzz.o fuzzutil-oss-fuzz.o
32 bdiff_fuzzer: bdiff.cc bdiff-oss-fuzz.o fuzzutil-oss-fuzz.o
33 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial bdiff.cc \
33 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial bdiff.cc \
34 bdiff-oss-fuzz.o fuzzutil-oss-fuzz.o -lFuzzingEngine -o \
34 bdiff-oss-fuzz.o fuzzutil-oss-fuzz.o -lFuzzingEngine -o \
35 $$OUT/bdiff_fuzzer
35 $$OUT/bdiff_fuzzer
36
36
37 mpatch.o: ../../mercurial/mpatch.c
37 mpatch.o: ../../mercurial/mpatch.c
38 $(CC) -g -O1 -fsanitize=fuzzer-no-link,address -c -o mpatch.o \
38 $(CC) -g -O1 -fsanitize=fuzzer-no-link,address -c -o mpatch.o \
39 ../../mercurial/mpatch.c
39 ../../mercurial/mpatch.c
40
40
41 mpatch: CXXFLAGS += -std=c++17
41 mpatch: CXXFLAGS += -std=c++17
42 mpatch: mpatch.cc mpatch.o fuzzutil.o
42 mpatch: mpatch.cc mpatch.o fuzzutil.o
43 $(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
43 $(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
44 -I../../mercurial mpatch.cc mpatch.o fuzzutil.o -o mpatch
44 -I../../mercurial mpatch.cc mpatch.o fuzzutil.o -o mpatch
45
45
46 mpatch-oss-fuzz.o: ../../mercurial/mpatch.c
46 mpatch-oss-fuzz.o: ../../mercurial/mpatch.c
47 $(CC) $(CFLAGS) -c -o mpatch-oss-fuzz.o ../../mercurial/mpatch.c
47 $(CC) $(CFLAGS) -c -o mpatch-oss-fuzz.o ../../mercurial/mpatch.c
48
48
49 mpatch_fuzzer: mpatch.cc mpatch-oss-fuzz.o fuzzutil-oss-fuzz.o
49 mpatch_fuzzer: mpatch.cc mpatch-oss-fuzz.o fuzzutil-oss-fuzz.o
50 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial mpatch.cc \
50 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial mpatch.cc \
51 mpatch-oss-fuzz.o fuzzutil-oss-fuzz.o -lFuzzingEngine -o \
51 mpatch-oss-fuzz.o fuzzutil-oss-fuzz.o -lFuzzingEngine -o \
52 $$OUT/mpatch_fuzzer
52 $$OUT/mpatch_fuzzer
53
53
54 mpatch_corpus.zip:
54 mpatch_corpus.zip:
55 python mpatch_corpus.py $$OUT/mpatch_fuzzer_seed_corpus.zip
55 python mpatch_corpus.py $$OUT/mpatch_fuzzer_seed_corpus.zip
56
56
57 x%.o: ../../mercurial/thirdparty/xdiff/x%.c ../../mercurial/thirdparty/xdiff/*.h
57 x%.o: ../../mercurial/thirdparty/xdiff/x%.c ../../mercurial/thirdparty/xdiff/*.h
58 $(CC) -g -O1 -fsanitize=fuzzer-no-link,address -c \
58 $(CC) -g -O1 -fsanitize=fuzzer-no-link,address -c \
59 -o $@ \
59 -o $@ \
60 $<
60 $<
61
61
62 xdiff: CXXFLAGS += -std=c++17
62 xdiff: CXXFLAGS += -std=c++17
63 xdiff: xdiff.cc xdiffi.o xprepare.o xutils.o fuzzutil.o
63 xdiff: xdiff.cc xdiffi.o xprepare.o xutils.o fuzzutil.o
64 $(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
64 $(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
65 -I../../mercurial xdiff.cc \
65 -I../../mercurial xdiff.cc \
66 xdiffi.o xprepare.o xutils.o fuzzutil.o -o xdiff
66 xdiffi.o xprepare.o xutils.o fuzzutil.o -o xdiff
67
67
68 fuzz-x%.o: ../../mercurial/thirdparty/xdiff/x%.c ../../mercurial/thirdparty/xdiff/*.h
68 fuzz-x%.o: ../../mercurial/thirdparty/xdiff/x%.c ../../mercurial/thirdparty/xdiff/*.h
69 $(CC) $(CFLAGS) -c \
69 $(CC) $(CFLAGS) -c \
70 -o $@ \
70 -o $@ \
71 $<
71 $<
72
72
73 xdiff_fuzzer: xdiff.cc fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o fuzzutil-oss-fuzz.o
73 xdiff_fuzzer: xdiff.cc fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o fuzzutil-oss-fuzz.o
74 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial xdiff.cc \
74 $(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial xdiff.cc \
75 fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o fuzzutil-oss-fuzz.o \
75 fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o fuzzutil-oss-fuzz.o \
76 -lFuzzingEngine -o $$OUT/xdiff_fuzzer
76 -lFuzzingEngine -o $$OUT/xdiff_fuzzer
77
77
78 manifest.o: ../../mercurial/cext/manifest.c
78 manifest.o: ../../mercurial/cext/manifest.c
79 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
79 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
80 -I../../mercurial \
80 -I../../mercurial \
81 -c -o manifest.o ../../mercurial/cext/manifest.c
81 -c -o manifest.o ../../mercurial/cext/manifest.c
82
82
83 charencode.o: ../../mercurial/cext/charencode.c
83 charencode.o: ../../mercurial/cext/charencode.c
84 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
84 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
85 -I../../mercurial \
85 -I../../mercurial \
86 -c -o charencode.o ../../mercurial/cext/charencode.c
86 -c -o charencode.o ../../mercurial/cext/charencode.c
87
87
88 parsers.o: ../../mercurial/cext/parsers.c
88 parsers.o: ../../mercurial/cext/parsers.c
89 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
89 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
90 -I../../mercurial \
90 -I../../mercurial \
91 -c -o parsers.o ../../mercurial/cext/parsers.c
91 -c -o parsers.o ../../mercurial/cext/parsers.c
92
92
93 dirs.o: ../../mercurial/cext/dirs.c
93 dirs.o: ../../mercurial/cext/dirs.c
94 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
94 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
95 -I../../mercurial \
95 -I../../mercurial \
96 -c -o dirs.o ../../mercurial/cext/dirs.c
96 -c -o dirs.o ../../mercurial/cext/dirs.c
97
97
98 pathencode.o: ../../mercurial/cext/pathencode.c
98 pathencode.o: ../../mercurial/cext/pathencode.c
99 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
99 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
100 -I../../mercurial \
100 -I../../mercurial \
101 -c -o pathencode.o ../../mercurial/cext/pathencode.c
101 -c -o pathencode.o ../../mercurial/cext/pathencode.c
102
102
103 revlog.o: ../../mercurial/cext/revlog.c
103 revlog.o: ../../mercurial/cext/revlog.c
104 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
104 $(CC) $(CFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
105 -I../../mercurial \
105 -I../../mercurial \
106 -c -o revlog.o ../../mercurial/cext/revlog.c
106 -c -o revlog.o ../../mercurial/cext/revlog.c
107
107
108 dirs_fuzzer: dirs.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
108 dirs_fuzzer: dirs.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
109 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
109 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
110 -Wno-register -Wno-macro-redefined \
110 -Wno-register -Wno-macro-redefined \
111 -I../../mercurial dirs.cc \
111 -I../../mercurial dirs.cc \
112 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
112 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
113 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
113 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
114 -o $$OUT/dirs_fuzzer
114 -o $$OUT/dirs_fuzzer
115
115
116 fncache_fuzzer: fncache.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
116 fncache_fuzzer: fncache.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
117 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
117 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
118 -Wno-register -Wno-macro-redefined \
118 -Wno-register -Wno-macro-redefined \
119 -I../../mercurial fncache.cc \
119 -I../../mercurial fncache.cc \
120 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
120 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
121 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
121 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
122 -o $$OUT/fncache_fuzzer
122 -o $$OUT/fncache_fuzzer
123
123
124 jsonescapeu8fast_fuzzer: jsonescapeu8fast.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
125 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
126 -Wno-register -Wno-macro-redefined \
127 -I../../mercurial jsonescapeu8fast.cc \
128 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
129 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
130 -o $$OUT/jsonescapeu8fast_fuzzer
131
124 manifest_corpus.zip:
132 manifest_corpus.zip:
125 python manifest_corpus.py $$OUT/manifest_fuzzer_seed_corpus.zip
133 python manifest_corpus.py $$OUT/manifest_fuzzer_seed_corpus.zip
126
134
127 manifest_fuzzer: manifest.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
135 manifest_fuzzer: manifest.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
128 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
136 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
129 -Wno-register -Wno-macro-redefined \
137 -Wno-register -Wno-macro-redefined \
130 -I../../mercurial manifest.cc \
138 -I../../mercurial manifest.cc \
131 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
139 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
132 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
140 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
133 -o $$OUT/manifest_fuzzer
141 -o $$OUT/manifest_fuzzer
134
142
135 revlog_fuzzer: revlog.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
143 revlog_fuzzer: revlog.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
136 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
144 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
137 -Wno-register -Wno-macro-redefined \
145 -Wno-register -Wno-macro-redefined \
138 -I../../mercurial revlog.cc \
146 -I../../mercurial revlog.cc \
139 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
147 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
140 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
148 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
141 -o $$OUT/revlog_fuzzer
149 -o $$OUT/revlog_fuzzer
142
150
143 revlog_corpus.zip:
151 revlog_corpus.zip:
144 python revlog_corpus.py $$OUT/revlog_fuzzer_seed_corpus.zip
152 python revlog_corpus.py $$OUT/revlog_fuzzer_seed_corpus.zip
145
153
146 dirstate_fuzzer: dirstate.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
154 dirstate_fuzzer: dirstate.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
147 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
155 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
148 -Wno-register -Wno-macro-redefined \
156 -Wno-register -Wno-macro-redefined \
149 -I../../mercurial dirstate.cc \
157 -I../../mercurial dirstate.cc \
150 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
158 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
151 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
159 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
152 -o $$OUT/dirstate_fuzzer
160 -o $$OUT/dirstate_fuzzer
153
161
154 dirstate_corpus.zip:
162 dirstate_corpus.zip:
155 python dirstate_corpus.py $$OUT/dirstate_fuzzer_seed_corpus.zip
163 python dirstate_corpus.py $$OUT/dirstate_fuzzer_seed_corpus.zip
156
164
157 fm1readmarkers_fuzzer: fm1readmarkers.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
165 fm1readmarkers_fuzzer: fm1readmarkers.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
158 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
166 $(CXX) $(CXXFLAGS) `$$OUT/sanpy/bin/python-config --cflags` \
159 -Wno-register -Wno-macro-redefined \
167 -Wno-register -Wno-macro-redefined \
160 -I../../mercurial fm1readmarkers.cc \
168 -I../../mercurial fm1readmarkers.cc \
161 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
169 manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
162 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
170 -lFuzzingEngine `$$OUT/sanpy/bin/python-config --ldflags` \
163 -o $$OUT/fm1readmarkers_fuzzer
171 -o $$OUT/fm1readmarkers_fuzzer
164
172
165 fm1readmarkers_corpus.zip:
173 fm1readmarkers_corpus.zip:
166 python fm1readmarkers_corpus.py $$OUT/fm1readmarkers_fuzzer_seed_corpus.zip
174 python fm1readmarkers_corpus.py $$OUT/fm1readmarkers_fuzzer_seed_corpus.zip
167
175
168 clean:
176 clean:
169 $(RM) *.o *_fuzzer \
177 $(RM) *.o *_fuzzer \
170 bdiff \
178 bdiff \
171 mpatch \
179 mpatch \
172 xdiff
180 xdiff
173
181
174 oss-fuzz: bdiff_fuzzer mpatch_fuzzer mpatch_corpus.zip xdiff_fuzzer dirs_fuzzer fncache_fuzzer manifest_fuzzer manifest_corpus.zip revlog_fuzzer revlog_corpus.zip dirstate_fuzzer dirstate_corpus.zip fm1readmarkers_fuzzer fm1readmarkers_corpus.zip
182 oss-fuzz: bdiff_fuzzer mpatch_fuzzer mpatch_corpus.zip xdiff_fuzzer dirs_fuzzer fncache_fuzzer jsonescapeu8fast_fuzzer manifest_fuzzer manifest_corpus.zip revlog_fuzzer revlog_corpus.zip dirstate_fuzzer dirstate_corpus.zip fm1readmarkers_fuzzer fm1readmarkers_corpus.zip
175
183
176 .PHONY: all clean oss-fuzz
184 .PHONY: all clean oss-fuzz
General Comments 0
You need to be logged in to leave comments. Login now