##// END OF EJS Templates
py3: use pycompat.bytestr() on extra values because it can be int...
py3: use pycompat.bytestr() on extra values because it can be int One such example is {'close': 1} which marks a branch as closed. This makes test-convert-mtn.t pass on Python 3. Differential Revision: https://phab.mercurial-scm.org/D5864

File last commit:

r41342:d60bd5c7 default
r41715:b436059c default
Show More
manifest.cc
68 lines | 1.8 KiB | text/x-c | CppLexer
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 #include <Python.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 #include "pyutil.h"
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 #include <string>
extern "C" {
Augie Fackler
fuzz: move many initialization steps into LLVMFuzzerInitialize...
r40409 static PyCodeObject *code;
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
{
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 contrib::initpy(*argv[0]);
Augie Fackler
fuzz: move many initialization steps into LLVMFuzzerInitialize...
r40409 code = (PyCodeObject *)Py_CompileString(R"py(
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 from parsers import lazymanifest
try:
Yuya Nishihara
fuzz: report error if Python code raised exception...
r40136 lm = lazymanifest(mdata)
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 # iterate the whole thing, which causes the code to fully parse
# every line in the manifest
Augie Fackler
fuzz: exercise more of the lazymanifest code...
r41342 for e, _, _ in lm.iterentries():
# also exercise __getitem__ et al
lm[e]
e in lm
(e + 'nope') in lm
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 lm[b'xyzzy'] = (b'\0' * 20, 'x')
# do an insert, text should change
assert lm.text() != mdata, "insert should change text and didn't: %r %r" % (lm.text(), mdata)
Augie Fackler
fuzz: exercise more of the lazymanifest code...
r41342 cloned = lm.filtercopy(lambda x: x != 'xyzzy')
assert cloned.text() == mdata, 'cloned text should equal mdata'
cloned.diff(lm)
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 del lm[b'xyzzy']
Augie Fackler
fuzz: exercise more of the lazymanifest code...
r41342 cloned.diff(lm)
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 # should be back to the same
assert lm.text() == mdata, "delete should have restored text but didn't: %r %r" % (lm.text(), mdata)
except Exception as e:
pass
# uncomment this print if you're editing this Python code
# to debug failures.
# print e
)py",
Augie Fackler
fuzz: move many initialization steps into LLVMFuzzerInitialize...
r40409 "fuzzer", Py_file_input);
return 0;
}
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
{
Augie Fackler
fuzz: restrict manifest input size...
r41341 // Don't allow fuzzer inputs larger than 100k, since we'll just bog
// down and not accomplish much.
if (Size > 100000) {
return 0;
}
Augie Fackler
fuzz: move many initialization steps into LLVMFuzzerInitialize...
r40409 PyObject *mtext =
PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
PyObject *locals = PyDict_New();
PyDict_SetItemString(locals, "mdata", mtext);
Augie Fackler
fuzz: extract Python initialization to utility package...
r41049 PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
Yuya Nishihara
fuzz: report error if Python code raised exception...
r40136 if (!res) {
PyErr_Print();
}
Py_XDECREF(res);
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 Py_DECREF(locals);
Py_DECREF(mtext);
return 0; // Non-zero return values are reserved for future use.
}
}