contrib/fuzz/revlog.cc
author Gregory Szorc <gregory.szorc@gmail.com>
Thu, 06 May 2021 15:45:04 -0700
changeset 47210 b128a3ae98ef
parent 43870 8766728dbce6
child 49792 efbbc2f9121e
permissions -rw-r--r--
contrib: upgrade Rust in Windows automation I'm not sure why we don't install the minimum required Rust version here like we do for Linux. Whatever: that's unrelated to wanting to stay modern. Differential Revision: https://phab.mercurial-scm.org/D10677
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41024
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     1
#include <Python.h>
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     2
#include <assert.h>
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     3
#include <stdlib.h>
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     4
#include <unistd.h>
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     5
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     6
#include <string>
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     7
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     8
#include "pyutil.h"
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
     9
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    10
extern "C" {
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    11
43870
8766728dbce6 fuzz: add support for fuzzing under either Python 2 or 3
Augie Fackler <augie@google.com>
parents: 43151
diff changeset
    12
static PYCODETYPE *code;
41024
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    13
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    14
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
{
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
	contrib::initpy(*argv[0]);
43870
8766728dbce6 fuzz: add support for fuzzing under either Python 2 or 3
Augie Fackler <augie@google.com>
parents: 43151
diff changeset
    17
	code = (PYCODETYPE *)Py_CompileString(R"py(
41024
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    18
for inline in (True, False):
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    19
    try:
43870
8766728dbce6 fuzz: add support for fuzzing under either Python 2 or 3
Augie Fackler <augie@google.com>
parents: 43151
diff changeset
    20
        index, cache = parsers.parse_index2(data, inline)
41335
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41334
diff changeset
    21
        index.slicechunktodensity(list(range(len(index))), 0.5, 262144)
43151
36e386dbbd30 fuzz: exercise a little more revlog code
Augie Fackler <augie@google.com>
parents: 41335
diff changeset
    22
        index.stats()
36e386dbbd30 fuzz: exercise a little more revlog code
Augie Fackler <augie@google.com>
parents: 41335
diff changeset
    23
        index.findsnapshots({}, 0)
36e386dbbd30 fuzz: exercise a little more revlog code
Augie Fackler <augie@google.com>
parents: 41335
diff changeset
    24
        10 in index
41335
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41334
diff changeset
    25
        for rev in range(len(index)):
43151
36e386dbbd30 fuzz: exercise a little more revlog code
Augie Fackler <augie@google.com>
parents: 41335
diff changeset
    26
            index.reachableroots(0, [len(index)-1], [rev])
41335
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41334
diff changeset
    27
            node = index[rev][7]
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41334
diff changeset
    28
            partial = index.shortest(node)
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41334
diff changeset
    29
            index.partialmatch(node[:partial])
43151
36e386dbbd30 fuzz: exercise a little more revlog code
Augie Fackler <augie@google.com>
parents: 41335
diff changeset
    30
            index.deltachain(rev, None, True)
41024
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    31
    except Exception as e:
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    32
        pass
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    33
        # uncomment this print if you're editing this Python code
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    34
        # to debug failures.
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    35
        # print e
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    36
)py",
43870
8766728dbce6 fuzz: add support for fuzzing under either Python 2 or 3
Augie Fackler <augie@google.com>
parents: 43151
diff changeset
    37
	                                      "fuzzer", Py_file_input);
41024
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    38
	return 0;
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    39
}
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    40
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    41
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    42
{
41334
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41024
diff changeset
    43
	// Don't allow fuzzer inputs larger than 60k, since we'll just bog
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41024
diff changeset
    44
	// down and not accomplish much.
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41024
diff changeset
    45
	if (Size > 60000) {
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41024
diff changeset
    46
		return 0;
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41024
diff changeset
    47
	}
41024
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    48
	PyObject *text =
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    49
	    PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    50
	PyObject *locals = PyDict_New();
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    51
	PyDict_SetItemString(locals, "data", text);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    52
	PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    53
	if (!res) {
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    54
		PyErr_Print();
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    55
	}
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    56
	Py_XDECREF(res);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    57
	Py_DECREF(locals);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    58
	Py_DECREF(text);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    59
	return 0; // Non-zero return values are reserved for future use.
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    60
}
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
    61
}