@@ -22,6 +22,27 @@ static int validate_stmt(struct validator *, stmt_ty);
22
22
static int validate_expr (struct validator * , expr_ty , expr_context_ty );
23
23
static int validate_pattern (struct validator * , pattern_ty , int );
24
24
25
+ #define VALIDATE_POSITIONS (node ) \
26
+ if (node->lineno > node->end_lineno) { \
27
+ PyErr_Format(PyExc_ValueError, \
28
+ "line %d-%d is not a valid range", \
29
+ node->lineno, node->end_lineno); \
30
+ return 0; \
31
+ } \
32
+ if ((node->lineno < 0 && node->end_lineno != node->lineno) || \
33
+ (node->col_offset < 0 && node->col_offset != node->end_col_offset)) { \
34
+ PyErr_Format(PyExc_ValueError, \
35
+ "line %d-%d, column %d-%d is not a valid range", \
36
+ node->lineno, node->end_lineno, node->col_offset, node->end_col_offset); \
37
+ return 0; \
38
+ } \
39
+ if (node->lineno == node->end_lineno && node->col_offset > node->end_col_offset) { \
40
+ PyErr_Format(PyExc_ValueError, \
41
+ "line %d, column %d-%d is not a valid range", \
42
+ node->lineno, node->col_offset, node->end_col_offset); \
43
+ return 0; \
44
+ }
45
+
25
46
static int
26
47
validate_name (PyObject * name )
27
48
{
@@ -183,6 +204,7 @@ validate_constant(struct validator *state, PyObject *value)
183
204
static int
184
205
validate_expr (struct validator * state , expr_ty exp , expr_context_ty ctx )
185
206
{
207
+ VALIDATE_POSITIONS (exp );
186
208
int ret = -1 ;
187
209
if (++ state -> recursion_depth > state -> recursion_limit ) {
188
210
PyErr_SetString (PyExc_RecursionError ,
@@ -505,6 +527,7 @@ validate_capture(PyObject *name)
505
527
static int
506
528
validate_pattern (struct validator * state , pattern_ty p , int star_ok )
507
529
{
530
+ VALIDATE_POSITIONS (p );
508
531
int ret = -1 ;
509
532
if (++ state -> recursion_depth > state -> recursion_limit ) {
510
533
PyErr_SetString (PyExc_RecursionError ,
@@ -674,6 +697,7 @@ validate_body(struct validator *state, asdl_stmt_seq *body, const char *owner)
674
697
static int
675
698
validate_stmt (struct validator * state , stmt_ty stmt )
676
699
{
700
+ VALIDATE_POSITIONS (stmt );
677
701
int ret = -1 ;
678
702
Py_ssize_t i ;
679
703
if (++ state -> recursion_depth > state -> recursion_limit ) {
0 commit comments