Commits

Anonymous committed a7c4aa8

Backport fix for SF808594: leak on lambda with duplicate arguments.

  • Participants
  • Parent commits d7bf123
  • Branches 2.3

Comments (0)

Files changed (1)

 }
 
 static int
+symtable_error(struct symtable *st, int lineno)
+{
+	if (lineno == 0)
+		lineno = st->st_cur->ste_lineno;
+	PyErr_SyntaxLocation(st->st_filename, lineno);
+	st->st_errors++;
+	return -1;
+}
+
+static int
 symtable_load_symbols(struct compiling *c)
 {
 	struct symtable *st = c->c_symtable;
 			if (flags & DEF_PARAM) {
 				PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
 					     PyString_AS_STRING(name));
-				PyErr_SyntaxLocation(st->st_filename, 
-						   ste->ste_lineno);
-				st->st_errors++;
+				symtable_error(st, 0);
 				goto fail;
 			}
 			if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
 	    if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
 		    PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
 				 PyString_AsString(name));
-		    PyErr_SyntaxLocation(st->st_filename,
-				       st->st_cur->ste_lineno);
-		    return -1;
+		    return symtable_error(st, 0);
 	    }
 	    val |= flag;
 	} else
 				PyErr_Format(PyExc_SyntaxError,
 				     "name '%.400s' is local and global",
 					     name);
-				PyErr_SyntaxLocation(st->st_filename,
-						   st->st_cur->ste_lineno);
-				st->st_errors++;
+				symtable_error(st, 0);
 				return;
 			}
 			else {
 			if (n->n_lineno >= st->st_future->ff_last_lineno) {
 				PyErr_SetString(PyExc_SyntaxError,
 						LATE_FUTURE);
- 				PyErr_SyntaxLocation(st->st_filename,
-						   n->n_lineno);
-				st->st_errors++;
+				symtable_error(st, n->n_lineno);
 				return;
 			}
 		}
 			if (strcmp(STR(tmp), "__debug__") == 0) {
 				PyErr_SetString(PyExc_SyntaxError, 
 						ASSIGN_DEBUG);
-				PyErr_SyntaxLocation(st->st_filename,
-						     n->n_lineno);
-				st->st_errors++;
+				symtable_error(st, n->n_lineno);
+				return;
 			}
 			symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
 		}