Mercurial > hg
changeset 25996:b12e00a05d57 stable
revset: prevent crash caused by empty group expression while optimizing "or"
An empty group expression "()" generates None in AST, so it should be tested
before destructuring a tuple.
"A | ()" is still evaluated to an error because I'm not sure whether "()"
represents an empty set or an empty expression (= a unit value). They are
identical in "or" operation, but they should be evaluated differently in
"and" operation.
expression empty set unit value
---------- --------- ----------
() {} A
A & () {} A
A | () A A
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 09 Aug 2015 16:09:41 +0900 |
parents | 4f703dcc626f |
children | d4e1e947444b |
files | mercurial/revset.py tests/test-revset.t |
diffstat | 2 files changed, 15 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revset.py Sun Aug 09 16:06:36 2015 +0900 +++ b/mercurial/revset.py Sun Aug 09 16:09:41 2015 +0900 @@ -2280,7 +2280,7 @@ del ss[:] for y in x[1:]: w, t = optimize(y, False) - if t[0] == 'string' or t[0] == 'symbol': + if t is not None and (t[0] == 'string' or t[0] == 'symbol'): ss.append((w, t)) continue flushss()
--- a/tests/test-revset.t Sun Aug 09 16:06:36 2015 +0900 +++ b/tests/test-revset.t Sun Aug 09 16:09:41 2015 +0900 @@ -1144,6 +1144,20 @@ 4 5 +no crash by empty group "()" while optimizing `or` operations + + $ try --optimize '0|()' + (or + ('symbol', '0') + (group + None)) + * optimized: + (or + ('symbol', '0') + None) + hg: parse error: missing argument + [255] + test that chained `or` operations never eat up stack (issue4624) (uses `0:1` instead of `0` to avoid future optimization of trivial revisions)