mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Fix crasher in unpacking assignments with star, where the size constraints
weren't checked.
This commit is contained in:
		
							parent
							
								
									4a983c550e
								
							
						
					
					
						commit
						deef67481c
					
				
					 2 changed files with 27 additions and 0 deletions
				
			
		|  | @ -143,6 +143,23 @@ | ||||||
|       ... |       ... | ||||||
|     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) | ||||||
| 		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) | ||||||
| 		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); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thomas Wouters
						Thomas Wouters