annotate contrib/fuzz/revlog.cc @ 42144:013de80bf90e

recover: add a --[no-]verify flag For trivial cases, the cost of the verify run after `hg recover` is getting in the way. In addition for very large repositories, the cost is simply too high to be paid, making `hg recover` an unusable commands. We introduce a --verify flag, set by default. If is automatically associated with a --no-verify flag that one can use to skip the verify step. We might consider changing the default behavior in the future. However this is out of scope for this series.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 17 Apr 2019 00:37:00 +0200
parents ebe51a2e75be
children 36e386dbbd30
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41014
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
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
12 static PyCodeObject *code;
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]);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
17 code = (PyCodeObject *)Py_CompileString(R"py(
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
18 from parsers import parse_index2
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
19 for inline in (True, False):
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
20 try:
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
21 index, cache = parse_index2(data, inline)
41310
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41309
diff changeset
22 index.slicechunktodensity(list(range(len(index))), 0.5, 262144)
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41309
diff changeset
23 for rev in range(len(index)):
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41309
diff changeset
24 node = index[rev][7]
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41309
diff changeset
25 partial = index.shortest(node)
ebe51a2e75be fuzz: exercise more of the revlog API
Augie Fackler <raf@durin42.com>
parents: 41309
diff changeset
26 index.partialmatch(node[:partial])
41014
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
27 except Exception as e:
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
28 pass
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
29 # 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
30 # to debug failures.
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
31 # print e
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
32 )py",
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
33 "fuzzer", Py_file_input);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
34 return 0;
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
35 }
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
36
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
37 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
38 {
41309
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41014
diff changeset
39 // 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: 41014
diff changeset
40 // down and not accomplish much.
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41014
diff changeset
41 if (Size > 60000) {
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41014
diff changeset
42 return 0;
afc33a5705b9 fuzz: don't allow enormous revlog inputs either
Augie Fackler <raf@durin42.com>
parents: 41014
diff changeset
43 }
41014
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
44 PyObject *text =
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
45 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
46 PyObject *locals = PyDict_New();
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
47 PyDict_SetItemString(locals, "data", text);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
48 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
49 if (!res) {
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
50 PyErr_Print();
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
51 }
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
52 Py_XDECREF(res);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
53 Py_DECREF(locals);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
54 Py_DECREF(text);
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
55 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
56 }
c06f0ef9a5ba fuzz: new fuzzer for revlog's parse_index2 method
Augie Fackler <augie@google.com>
parents:
diff changeset
57 }