##// END OF EJS Templates
errors: stop passing non-strings to Abort's constructor...
errors: stop passing non-strings to Abort's constructor The next patch will change `Abort`'s constructor and `__bytes__` functions and they will start assuming that the first argument is the messages as `bytes`. Differential Revision: https://phab.mercurial-scm.org/D9178

File last commit:

r45691:61e74644 default
r46273:a736ab68 default
Show More
test-parseindex.t
223 lines | 7.3 KiB | text/troff | Tads3Lexer
/ tests / test-parseindex.t
Matt Mackall
tests: unify test-parseindex
r12476 revlog.parseindex must be able to parse the index file even if
an index entry is split between two 64k blocks. The ideal test
would be to create an index file with inline data where
64k < size < 64k + 64 (64k is the size of the read buffer, 64 is
the size of an index entry) and with an index entry starting right
before the 64k block boundary, and try to read it.
We approximate that by reducing the read buffer to 1 byte.
$ hg init a
$ cd a
$ echo abc > foo
$ hg add foo
$ hg commit -m 'add foo'
$ echo >> foo
$ hg commit -m 'change foo'
$ hg log -r 0:
changeset: 0:7c31755bf9b5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: add foo
changeset: 1:26333235a41c
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change foo
$ cat >> test.py << EOF
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > from __future__ import print_function
Augie Fackler
py3: port test-parseindex.t to Python 3...
r41389 > from mercurial import changelog, node, pycompat, vfs
Matt Mackall
tests: unify test-parseindex
r12476 >
> class singlebyteread(object):
> def __init__(self, real):
> self.real = real
>
> def read(self, size=-1):
> if size == 65536:
> size = 1
> return self.real.read(size)
>
> def __getattr__(self, key):
> return getattr(self.real, key)
>
Boris Feld
parseindex: implement context manager method on the wrapper...
r35984 > def __enter__(self):
> self.real.__enter__()
> return self
>
> def __exit__(self, *args, **kwargs):
> return self.real.__exit__(*args, **kwargs)
>
Matt Mackall
tests: unify test-parseindex
r12476 > def opener(*args):
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-parseindex'...
r31250 > o = vfs.vfs(*args)
Boris Feld
parseindex: also forward keyword argument in a debug wrapper...
r35983 > def wrapper(*a, **kwargs):
> f = o(*a, **kwargs)
Matt Mackall
tests: unify test-parseindex
r12476 > return singlebyteread(f)
vfs: give all vfs an options attribute by default...
r43295 > wrapper.options = o.options
Matt Mackall
tests: unify test-parseindex
r12476 > return wrapper
>
Augie Fackler
py3: port test-parseindex.t to Python 3...
r41389 > cl = changelog.changelog(opener(b'.hg/store'))
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print(len(cl), 'revisions:')
Matt Mackall
tests: unify test-parseindex
r12476 > for r in cl:
Augie Fackler
py3: port test-parseindex.t to Python 3...
r41389 > print(pycompat.sysstr(node.short(cl.node(r))))
Matt Mackall
tests: unify test-parseindex
r12476 > EOF
Matt Harbison
tests: quote PYTHON usage...
r39743 $ "$PYTHON" test.py
Matt Mackall
tests: unify test-parseindex
r12476 2 revisions:
7c31755bf9b5
26333235a41c
Mads Kiilerich
tests: add missing trailing 'cd ..'...
r16913
$ cd ..
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 #if no-pure
Test SEGV caused by bad revision passed to reachableroots() (issue4775):
$ cd a
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810
Matt Harbison
tests: quote PYTHON usage...
r39743 $ "$PYTHON" <<EOF
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > from __future__ import print_function
Pierre-Yves David
vfs: use 'vfs' module directly in 'test-parseindex'...
r31250 > from mercurial import changelog, vfs
Augie Fackler
py3: port test-parseindex.t to Python 3...
r41389 > cl = changelog.changelog(vfs.vfs(b'.hg/store'))
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('good heads:')
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > for head in [0, len(cl) - 1, -1]:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('%s: %r' % (head, cl.reachableroots(0, [head], [0])))
> print('bad heads:')
Yuya Nishihara
reachableroots: verify type of each item of heads argument...
r26018 > for head in [len(cl), 10000, -2, -10000, None]:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('%s:' % head, end=' ')
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > try:
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > cl.reachableroots(0, [head], [0])
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('uncaught buffer overflow?')
Yuya Nishihara
reachableroots: verify type of each item of heads argument...
r26018 > except (IndexError, TypeError) as inst:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print(inst)
> print('good roots:')
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > for root in [0, len(cl) - 1, -1]:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('%s: %r' % (root, cl.reachableroots(root, [len(cl) - 1], [root])))
> print('out-of-range roots are ignored:')
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > for root in [len(cl), 10000, -2, -10000]:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('%s: %r' % (root, cl.reachableroots(root, [len(cl) - 1], [root])))
> print('bad roots:')
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > for root in [None]:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('%s:' % root, end=' ')
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > try:
> cl.reachableroots(root, [len(cl) - 1], [root])
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('uncaught error?')
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > except TypeError as inst:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print(inst)
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 > EOF
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 good heads:
Yuya Nishihara
reachableroots: construct and sort baseset in revset module...
r26094 0: [0]
1: [0]
-1: []
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 bad heads:
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017 2: head out of range
10000: head out of range
-2: head out of range
-10000: head out of range
Augie Fackler
py3: port test-parseindex.t to Python 3...
r41389 None: an integer is required( .got type NoneType.)? (re)
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 good roots:
Yuya Nishihara
reachableroots: construct and sort baseset in revset module...
r26094 0: [0]
1: [1]
-1: [-1]
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 out-of-range roots are ignored:
Yuya Nishihara
reachableroots: construct and sort baseset in revset module...
r26094 2: []
10000: []
-2: []
-10000: []
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 bad roots:
Augie Fackler
py3: port test-parseindex.t to Python 3...
r41389 None: an integer is required( .got type NoneType.)? (re)
Yuya Nishihara
reachableroots: verify integer range of heads argument (issue4775)...
r26017
$ cd ..
Test corrupted p1/p2 fields that could cause SEGV at parsers.c:
Yuya Nishihara
tests: disable test of buffer overflow in parsers.c if --pure...
r25859
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 $ mkdir invalidparent
$ cd invalidparent
Boris Feld
test: make sure sparse-revlog does not interfer with test-parseindex.t...
r40923 $ hg clone --pull -q --config phases.publish=False ../a limit --config format.sparse-revlog=no
$ hg clone --pull -q --config phases.publish=False ../a neglimit --config format.sparse-revlog=no
$ hg clone --pull -q --config phases.publish=False ../a segv --config format.sparse-revlog=no
Yuya Nishihara
revlog: fix out-of-bounds access by negative parents read from revlog (SEC)...
r40848 $ rm -R limit/.hg/cache neglimit/.hg/cache segv/.hg/cache
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810
Matt Harbison
tests: quote PYTHON usage...
r39743 $ "$PYTHON" <<EOF
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > data = open("limit/.hg/store/00changelog.i", "rb").read()
Yuya Nishihara
revlog: fix out-of-bounds access by negative parents read from revlog (SEC)...
r40848 > poisons = [
> (b'limit', b'\0\0\0\x02'),
> (b'neglimit', b'\xff\xff\xff\xfe'),
> (b'segv', b'\0\x01\0\0'),
> ]
> for n, p in poisons:
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > # corrupt p1 at rev0 and p2 at rev1
> d = data[:24] + p + data[28:127 + 28] + p + data[127 + 32:]
Pulkit Goyal
py3: add b'' prefixes in tests/test-parseindex.t...
r38098 > open(n + b"/.hg/store/00changelog.i", "wb").write(d)
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > EOF
Gregory Szorc
debugcommands: introduce debugrevlogindex (BC)...
r39318 $ hg -R limit debugrevlogindex -f1 -c
Gregory Szorc
debugcommands: drop offset and length from debugindex by default...
r37301 rev flag size link p1 p2 nodeid
0 0000 62 0 2 -1 7c31755bf9b5
1 0000 65 1 0 2 26333235a41c
Gregory Szorc
tests: use debugdeltachain where appropriate...
r37299
$ hg -R limit debugdeltachain -c
rev chain# chainlen prev delta size rawsize chainsize ratio lindist extradist extraratio
0 1 1 -1 base 63 62 63 1.01613 63 0 0.00000
1 2 1 -1 base 66 65 66 1.01538 66 0 0.00000
Yuya Nishihara
revlog: fix out-of-bounds access by negative parents read from revlog (SEC)...
r40848 $ hg -R neglimit debugrevlogindex -f1 -c
rev flag size link p1 p2 nodeid
0 0000 62 0 -2 -1 7c31755bf9b5
1 0000 65 1 0 -2 26333235a41c
Gregory Szorc
debugcommands: introduce debugrevlogindex (BC)...
r39318 $ hg -R segv debugrevlogindex -f1 -c
Gregory Szorc
debugcommands: drop offset and length from debugindex by default...
r37301 rev flag size link p1 p2 nodeid
0 0000 62 0 65536 -1 7c31755bf9b5
1 0000 65 1 0 65536 26333235a41c
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810
Gregory Szorc
tests: use debugdeltachain where appropriate...
r37299 $ hg -R segv debugdeltachain -c
rev chain# chainlen prev delta size rawsize chainsize ratio lindist extradist extraratio
0 1 1 -1 base 63 62 63 1.01613 63 0 0.00000
1 2 1 -1 base 66 65 66 1.01538 66 0 0.00000
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 $ cat <<EOF > test.py
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > from __future__ import print_function
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > import sys
Augie Fackler
py3: port test-parseindex.t to Python 3...
r41389 > from mercurial import changelog, pycompat, vfs
> cl = changelog.changelog(vfs.vfs(pycompat.fsencode(sys.argv[1])))
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > n0, n1 = cl.node(0), cl.node(1)
> ops = [
Yuya Nishihara
reachableroots: unify bail cases to raise exception correctly...
r26016 > ('reachableroots',
Yuya Nishihara
reachableroots: use internal "revstates" array to test if rev is a root...
r26053 > lambda: cl.index.reachableroots2(0, [1], [0], False)),
Joerg Sonnenberger
phases: sparsify phaseroots and phasesets...
r45691 > ('compute_phases_map_sets', lambda: cl.computephases({1: {cl.node(0)}})),
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > ('index_headrevs', lambda: cl.headrevs()),
> ('find_gca_candidates', lambda: cl.commonancestorsheads(n0, n1)),
> ('find_deepest', lambda: cl.ancestor(n0, n1)),
> ]
> for l, f in ops:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print(l + ':', end=' ')
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > try:
> f()
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print('uncaught buffer overflow?')
Pulkit Goyal
py3: use `except error as e` instead of `except error, e`...
r38100 > except ValueError as inst:
Pulkit Goyal
py3: use print as a function in tests/test-parseindex.t...
r38090 > print(inst)
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 > EOF
Matt Harbison
tests: quote PYTHON usage...
r39743 $ "$PYTHON" test.py limit/.hg/store
Yuya Nishihara
reachableroots: unify bail cases to raise exception correctly...
r26016 reachableroots: parent out of range
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 compute_phases_map_sets: parent out of range
index_headrevs: parent out of range
find_gca_candidates: parent out of range
find_deepest: parent out of range
Yuya Nishihara
revlog: fix out-of-bounds access by negative parents read from revlog (SEC)...
r40848 $ "$PYTHON" test.py neglimit/.hg/store
reachableroots: parent out of range
compute_phases_map_sets: parent out of range
index_headrevs: parent out of range
find_gca_candidates: parent out of range
find_deepest: parent out of range
Matt Harbison
tests: quote PYTHON usage...
r39743 $ "$PYTHON" test.py segv/.hg/store
Yuya Nishihara
reachableroots: unify bail cases to raise exception correctly...
r26016 reachableroots: parent out of range
Yuya Nishihara
parsers: fix buffer overflow by invalid parent revision read from revlog...
r25810 compute_phases_map_sets: parent out of range
index_headrevs: parent out of range
find_gca_candidates: parent out of range
find_deepest: parent out of range
$ cd ..
Yuya Nishihara
tests: disable test of buffer overflow in parsers.c if --pure...
r25859
#endif