##// END OF EJS Templates
branch: allow changing branch of merge commits with --rev...
branch: allow changing branch of merge commits with --rev Tests show that changing branch of merge commits works fine with evolution and without, so let's allow it. Other safeguards should prevent users from shooting themselves in the foot.

File last commit:

r40409:c3ab0a89 default
r40702:69268a13 default
Show More
manifest.cc
83 lines | 2.4 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>
#include <string>
extern "C" {
/* TODO: use Python 3 for this fuzzing? */
PyMODINIT_FUNC initparsers(void);
static char cpypath[8192] = "\0";
Augie Fackler
fuzz: move many initialization steps into LLVMFuzzerInitialize...
r40409 static PyCodeObject *code;
static PyObject *mainmod;
static PyObject *globals;
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
{
const std::string subdir = "/sanpy/lib/python2.7";
/* HACK ALERT: we need a full Python installation built without
pymalloc and with ASAN, so we dump one in
$OUT/sanpy/lib/python2.7. This helps us wire that up. */
std::string selfpath(*argv[0]);
std::string pypath;
auto pos = selfpath.rfind("/");
if (pos == std::string::npos) {
char wd[8192];
getcwd(wd, 8192);
pypath = std::string(wd) + subdir;
} else {
pypath = selfpath.substr(0, pos) + subdir;
}
strncpy(cpypath, pypath.c_str(), pypath.size());
setenv("PYTHONPATH", cpypath, 1);
Augie Fackler
fuzz: try setting PYTHONNOUSERSITE=1 to avoid loading site-packages...
r40181 setenv("PYTHONNOUSERSITE", "1", 1);
Augie Fackler
fuzz: try *even harder* to prevent Python from looking up usernames...
r40316 /* prevent Python from looking up users in the fuzz environment */
setenv("PYTHONUSERBASE", cpypath, 1);
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 Py_SetPythonHome(cpypath);
Augie Fackler
fuzzers: init Python in LLVMFuzzerInitialize and intentionally leak it...
r40125 Py_InitializeEx(0);
Augie Fackler
fuzz: new fuzzer for cext/manifest.c...
r40089 initparsers();
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
list(lm.iterentries())
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)
del lm[b'xyzzy']
# 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);
mainmod = PyImport_AddModule("__main__");
globals = PyModule_GetDict(mainmod);
return 0;
}
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
{
PyObject *mtext =
PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
PyObject *locals = PyDict_New();
PyDict_SetItemString(locals, "mdata", mtext);
Yuya Nishihara
fuzz: report error if Python code raised exception...
r40136 PyObject *res = PyEval_EvalCode(code, globals, locals);
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.
}
}