Kaydet (Commit) deef6748 authored tarafından Thomas Wouters's avatar Thomas Wouters

Fix crasher in unpacking assignments with star, where the size constraints

weren't checked.
üst 4a983c55
...@@ -143,6 +143,23 @@ Now some general starred expressions (all fail). ...@@ -143,6 +143,23 @@ Now some general starred expressions (all fail).
... ...
SyntaxError: can use starred expression only as assignment target SyntaxError: can use starred expression only as assignment target
Some size constraints (all fail.)
>>> s = ", ".join("a%d" % i for i in range(1<<8)) + ", *rest = range(1<<8 + 1)"
>>> compile(s, 'test', 'exec') # doctest:+ELLIPSIS
Traceback (most recent call last):
...
SyntaxError: too many expressions in star-unpacking assignment
>>> s = ", ".join("a%d" % i for i in range(1<<8 + 1)) + ", *rest = range(1<<8 + 2)"
>>> compile(s, 'test', 'exec') # doctest:+ELLIPSIS
Traceback (most recent call last):
...
SyntaxError: too many expressions in star-unpacking assignment
(there is an additional limit, on the number of expressions after the
'*rest', but it's 1<<24 and testing it takes too much memory.)
""" """
__test__ = {'doctests' : doctests} __test__ = {'doctests' : doctests}
......
...@@ -2614,6 +2614,11 @@ compiler_list(struct compiler *c, expr_ty e) ...@@ -2614,6 +2614,11 @@ compiler_list(struct compiler *c, expr_ty e)
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
expr_ty elt = asdl_seq_GET(e->v.List.elts, i); expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
if (elt->kind == Starred_kind && !seen_star) { if (elt->kind == Starred_kind && !seen_star) {
if ((i >= (1 << 8)) ||
(n-i-1 >= (INT_MAX >> 8)))
return compiler_error(c,
"too many expressions in "
"star-unpacking assignment");
ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8))); ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
seen_star = 1; seen_star = 1;
asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value); asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
...@@ -2642,6 +2647,11 @@ compiler_tuple(struct compiler *c, expr_ty e) ...@@ -2642,6 +2647,11 @@ compiler_tuple(struct compiler *c, expr_ty e)
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i); expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
if (elt->kind == Starred_kind && !seen_star) { if (elt->kind == Starred_kind && !seen_star) {
if ((i >= (1 << 8)) ||
(n-i-1 >= (INT_MAX >> 8)))
return compiler_error(c,
"too many expressions in "
"star-unpacking assignment");
ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8))); ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
seen_star = 1; seen_star = 1;
asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value); asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment