manifest: tigher manifest parsing and flag use
In the manifest line, flags are put directly after the hash, so the
parser has been guessing the presence of flags based on the length of
the hash. Replace this assumption by an enumeration of the valid flags
and removing them from the hash first as they are distinct input values.
Consistently handle the expected 256bit length of the SHA1-replacement
in the pure Python parser. Check that setting flags will use one of the
blessed values.
Extend write logic in the C version to handle 256bit hashes as well.
Verify that hashes always have exactly the expected length. Since
1070df141718 we should no longer depend on the old extra-byte hack.
Differential Revision: https://phab.mercurial-scm.org/D8679
#require test-repo
$ cd $TESTDIR/../contrib/fuzz
$ OUT=$TESTTMP ; export OUT
which(1) could exit nonzero, but that's fine because we'll still end
up without a valid executable, so we don't need to check $? here.
$ if which gmake >/dev/null 2>&1; then
> MAKE=gmake
> else
> MAKE=make
> fi
$ havefuzz() {
> cat > $TESTTMP/dummy.cc <<EOF
> #include <stdlib.h>
> #include <stdint.h>
> int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
> int main(int argc, char **argv) {
> const char data[] = "asdf";
> return LLVMFuzzerTestOneInput((const uint8_t *)data, 4);
> }
> EOF
> $CXX $TESTTMP/dummy.cc -o $TESTTMP/dummy \
> -fsanitize=fuzzer-no-link,address || return 1
> }
#if clang-libfuzzer
$ CXX=clang++ havefuzz || exit 80
$ $MAKE -s clean all PYTHON_CONFIG=`which python-config`
#endif
#if no-clang-libfuzzer clang-6.0
$ CXX=clang++-6.0 havefuzz || exit 80
$ $MAKE -s clean all CC=clang-6.0 CXX=clang++-6.0 PYTHON_CONFIG=`which python-config`
#endif
#if no-clang-libfuzzer no-clang-6.0
$ exit 80
#endif
$ cd $TESTTMP
Run each fuzzer using dummy.cc as a fake input, to make sure it runs
at all. In the future we should instead unpack the corpus for each
fuzzer and use that instead.
$ for fuzzer in `ls *_fuzzer | sort` ; do
> echo run $fuzzer...
> ./$fuzzer dummy.cc > /dev/null 2>&1
> done
run bdiff_fuzzer...
run dirs_fuzzer...
run dirstate_fuzzer...
run fm1readmarkers_fuzzer...
run fncache_fuzzer...
run jsonescapeu8fast_fuzzer...
run manifest_fuzzer...
run mpatch_fuzzer...
run revlog_fuzzer...
run xdiff_fuzzer...
Clean up.
$ cd $TESTDIR/../contrib/fuzz
$ $MAKE -s clean