From: Martin v. Löwis Date: Thu, 2 Mar 2006 00:31:27 +0000 (+0000) Subject: Fix memory leak on attributes. X-Git-Tag: v2.5a0~410 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=03e5bc02c9744640f4d228ff7686c2392ab17812;p=python Fix memory leak on attributes. --- diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 3e2acf4372..ad2209d003 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -607,7 +607,9 @@ class ObjVisitor(PickleVisitor): for a in sum.attributes: self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1) self.emit("if (!value) goto failed;", 1) - self.emit('PyObject_SetAttrString(result, "%s", value);' % a.name, 1) + self.emit('if (PyObject_SetAttrString(result, "%s", value) < 0)' % a.name, 1) + self.emit('goto failed;', 2) + self.emit('Py_DECREF(value);', 1) self.func_end() def simpleSum(self, sum, name): diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 3e49212a04..3f8345ebf4 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -2324,10 +2324,14 @@ ast2obj_stmt(void* _o) } value = ast2obj_int(o->lineno); if (!value) goto failed; - PyObject_SetAttrString(result, "lineno", value); + if (PyObject_SetAttrString(result, "lineno", value) < 0) + goto failed; + Py_DECREF(value); value = ast2obj_int(o->col_offset); if (!value) goto failed; - PyObject_SetAttrString(result, "col_offset", value); + if (PyObject_SetAttrString(result, "col_offset", value) < 0) + goto failed; + Py_DECREF(value); return result; failed: Py_XDECREF(value); @@ -2643,10 +2647,14 @@ ast2obj_expr(void* _o) } value = ast2obj_int(o->lineno); if (!value) goto failed; - PyObject_SetAttrString(result, "lineno", value); + if (PyObject_SetAttrString(result, "lineno", value) < 0) + goto failed; + Py_DECREF(value); value = ast2obj_int(o->col_offset); if (!value) goto failed; - PyObject_SetAttrString(result, "col_offset", value); + if (PyObject_SetAttrString(result, "col_offset", value) < 0) + goto failed; + Py_DECREF(value); return result; failed: Py_XDECREF(value); @@ -3023,7 +3031,7 @@ init_ast(void) if (PyDict_SetItemString(d, "AST", (PyObject*)AST_type) < 0) return; if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0) return; - if (PyModule_AddStringConstant(m, "__version__", "42649") < 0) + if (PyModule_AddStringConstant(m, "__version__", "42753") < 0) return; if(PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return; if(PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)