fuzz: tell manifest fuzzer about longer node hashes
Differential Revision: https://phab.mercurial-scm.org/D8374
--- a/contrib/fuzz/manifest.cc Mon Jun 01 20:57:14 2020 +0200
+++ b/contrib/fuzz/manifest.cc Wed Jan 08 11:33:41 2020 -0500
@@ -3,6 +3,7 @@
#include <stdlib.h>
#include <unistd.h>
+#include "FuzzedDataProvider.h"
#include "pyutil.h"
#include <string>
@@ -24,7 +25,7 @@
lm[e]
e in lm
(e + 'nope') in lm
- lm[b'xyzzy'] = (b'\0' * 20, 'x')
+ lm[b'xyzzy'] = (b'\0' * nlen, 'x')
# do an insert, text should change
assert lm.text() != mdata, "insert should change text and didn't: %r %r" % (lm.text(), mdata)
cloned = lm.filtercopy(lambda x: x != 'xyzzy')
@@ -51,10 +52,14 @@
if (Size > 100000) {
return 0;
}
+ FuzzedDataProvider provider(Data, Size);
+ Py_ssize_t nodelength = provider.ConsumeBool() ? 20 : 32;
+ PyObject *nlen = PyLong_FromSsize_t(nodelength);
PyObject *mtext =
PyBytes_FromStringAndSize((const char *)Data, (Py_ssize_t)Size);
PyObject *locals = PyDict_New();
PyDict_SetItemString(locals, "mdata", mtext);
+ PyDict_SetItemString(locals, "nlen", nlen);
PyObject *res = PyEval_EvalCode(code, contrib::pyglobals(), locals);
if (!res) {
PyErr_Print();
--- a/contrib/fuzz/manifest_corpus.py Mon Jun 01 20:57:14 2020 +0200
+++ b/contrib/fuzz/manifest_corpus.py Wed Jan 08 11:33:41 2020 -0500
@@ -10,7 +10,7 @@
with zipfile.ZipFile(args.out[0], "w", zipfile.ZIP_STORED) as zf:
zf.writestr(
"manifest_zero",
- '''PKG-INFO\09b3ed8f2b81095a13064402e930565f083346e9a
+ '''\0PKG-INFO\09b3ed8f2b81095a13064402e930565f083346e9a
README\080b6e76643dcb44d4bc729e932fc464b3e36dbe3
hg\0b6444347c629cc058d478023905cfb83b7f5bb9d
mercurial/__init__.py\0b80de5d138758541c5f05265ad144ab9fa86d1db
@@ -25,9 +25,14 @@
tkmerge\03c922edb43a9c143682f7bc7b00f98b3c756ebe7
''',
)
- zf.writestr("badmanifest_shorthashes", "narf\0aa\nnarf2\0aaa\n")
+ zf.writestr("badmanifest_shorthashes", "\0narf\0aa\nnarf2\0aaa\n")
zf.writestr(
"badmanifest_nonull",
- "narf\0cccccccccccccccccccccccccccccccccccccccc\n"
+ "\0narf\0cccccccccccccccccccccccccccccccccccccccc\n"
"narf2aaaaaaaaaaaaaaaaaaaa\n",
)
+
+ zf.writestr(
+ "manifest_long_nodes",
+ "\1a\0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n",
+ )