contrib/fuzz/fncache.cc
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 09 Nov 2019 13:23:51 +0100
changeset 43601 2da51e292734
parent 43152 b37dd26935ee
child 43870 8766728dbce6
permissions -rw-r--r--
index: use `index.rev` in `revlog.rev` Differential Revision: https://phab.mercurial-scm.org/D7325
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43152
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     1
#include <Python.h>
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     2
#include <assert.h>
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     3
#include <stdlib.h>
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     4
#include <unistd.h>
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     5
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     6
#include "pyutil.h"
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     7
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     8
#include <iostream>
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
     9
#include <string>
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    10
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    11
extern "C" {
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    12
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    13
static PyCodeObject *code;
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    14
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    15
extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    16
{
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    17
	contrib::initpy(*argv[0]);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    18
	code = (PyCodeObject *)Py_CompileString(R"py(
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    19
from parsers import (
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    20
    isasciistr,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    21
    asciilower,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    22
    asciiupper,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    23
    encodedir,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    24
    pathencode,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    25
    lowerencode,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    26
)
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    27
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    28
try:
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    29
    for fn in (
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    30
        isasciistr,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    31
        asciilower,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    32
        asciiupper,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    33
        encodedir,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    34
        pathencode,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    35
        lowerencode,
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    36
    ):
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    37
        try:
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    38
            fn(data)
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    39
        except UnicodeDecodeError:
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    40
            pass  # some functions emit this exception
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    41
        except AttributeError:
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    42
            # pathencode needs hashlib, which fails to import because the time
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    43
            # module fails to import. We should try and fix that some day, but
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    44
            # for now we at least get coverage on non-hashencoded codepaths.
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    45
            if fn != pathencode:
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    46
                raise
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    47
        # uncomment this for debugging exceptions
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    48
        # except Exception as e:
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    49
        #     raise Exception('%r: %r' % (fn, e))
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    50
except Exception as e:
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    51
    pass
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    52
    # uncomment this print if you're editing this Python code
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    53
    # to debug failures.
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    54
    # print(e)
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    55
)py",
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    56
	                                        "fuzzer", Py_file_input);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    57
	if (!code) {
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    58
		std::cerr << "failed to compile Python code!" << std::endl;
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    59
	}
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    60
	return 0;
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    61
}
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    62
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    63
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    64
{
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    65
	PyObject *mtext =
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    66
	    PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    67
	PyObject *locals = PyDict_New();
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    68
	PyDict_SetItemString(locals, "data", mtext);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    69
	PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    70
	if (!res) {
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    71
		PyErr_Print();
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    72
	}
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    73
	Py_XDECREF(res);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    74
	Py_DECREF(locals);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    75
	Py_DECREF(mtext);
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    76
	return 0; // Non-zero return values are reserved for future use.
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    77
}
b37dd26935ee fuzz: new fuzzer for fncache-related functions
Augie Fackler <augie@google.com>
parents:
diff changeset
    78
}