##// END OF EJS Templates
ci: use the `v1.0` flavor of the docker images in the CI...
ci: use the `v1.0` flavor of the docker images in the CI This new versioning will help us to maintain backward compatibility in the docker image. This will be useful to deal with mismatch between default/stable in version and the re-run CI on older changesets in the future. Once this changeset land on stable, we will have to merge it in default. Then we can start make backward incompatible changes in a new image version. Differential Revision: https://phab.mercurial-scm.org/D12388

File last commit:

r44311:8766728d default
r49831:2bb75c65 stable
Show More
jsonescapeu8fast.cc
55 lines | 1.4 KiB | text/x-c | CppLexer
#include <Python.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include "pyutil.h"
#include <iostream>
#include <string>
#include "FuzzedDataProvider.h"
extern "C" {
static PYCODETYPE *code;
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
{
contrib::initpy(*argv[0]);
code = (PYCODETYPE *)Py_CompileString(R"py(
try:
parsers.jsonescapeu8fast(data, paranoid)
except Exception as e:
pass
# uncomment this print if you're editing this Python code
# to debug failures.
# print(e)
)py",
"fuzzer", Py_file_input);
if (!code) {
std::cerr << "failed to compile Python code!" << std::endl;
}
return 0;
}
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
{
FuzzedDataProvider provider(Data, Size);
bool paranoid = provider.ConsumeBool();
std::string remainder = provider.ConsumeRemainingBytesAsString();
PyObject *mtext = PyBytes_FromStringAndSize(
(const char *)remainder.c_str(), remainder.size());
PyObject *locals = PyDict_New();
PyDict_SetItemString(locals, "data", mtext);
PyDict_SetItemString(locals, "paranoid", paranoid ? Py_True : Py_False);
PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
if (!res) {
PyErr_Print();
}
Py_XDECREF(res);
Py_DECREF(locals);
Py_DECREF(mtext);
return 0; // Non-zero return values are reserved for future use.
}
}