contrib/fuzz/fm1readmarkers.cc
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 09 Sep 2019 17:32:21 +0200
branchstable
changeset 42915 a4ca0610c754
parent 41024 6a951f535fee
child 43859 8766728dbce6
permissions -rw-r--r--
merge: respect parents order when using `graft` on a merge The previous code did not record the index of the replaced parent. It was always using the "graft" destination as `p1`. This could switch parents order in some situation (eg: some of the evolve evolving merge case). Recording and using the information fixes the issue in evolve. We are not aware of core commands calling graft in that fashion, so we could not build a simple test case for it using core commands.

#include <Python.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>

#include <string>

#include "pyutil.h"

extern "C" {

static PyCodeObject *code;

extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
{
	contrib::initpy(*argv[0]);
	code = (PyCodeObject *)Py_CompileString(R"py(
from parsers import fm1readmarkers
def maybeint(s, default):
    try:
        return int(s)
    except ValueError:
        return default
try:
    parts = data.split('\0', 2)
    if len(parts) == 3:
        offset, stop, data = parts
    elif len(parts) == 2:
        stop, data = parts
        offset = 0
    else:
        offset = stop = 0
    offset, stop = maybeint(offset, 0), maybeint(stop, len(data))
    fm1readmarkers(data, offset, stop)
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);
	return 0;
}

int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
{
	PyObject *text =
	    PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
	PyObject *locals = PyDict_New();
	PyDict_SetItemString(locals, "data", text);
	PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
	if (!res) {
		PyErr_Print();
	}
	Py_XDECREF(res);
	Py_DECREF(locals);
	Py_DECREF(text);
	return 0; // Non-zero return values are reserved for future use.
}
}