aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2020-11-13 12:53:53 +0000
committerGitHub <noreply@github.com>2020-11-13 12:53:53 +0000
commitfd009e606a48e803e7187983bf9a5682e938fddb (patch)
tree7d3d443a3525a26bb0e24b8d26f5e7da16f1671a /Python/compile.c
parentbpo-42246: Eliminate jumps to exit blocks by copying those blocks. (#23251) (diff)
downloadcpython-fd009e606a48e803e7187983bf9a5682e938fddb.tar.gz
cpython-fd009e606a48e803e7187983bf9a5682e938fddb.tar.bz2
cpython-fd009e606a48e803e7187983bf9a5682e938fddb.zip
bpo-42246: Fix memory leak in compiler (GH-23256)
* Fix potential memory leak in assembler init. * Fix reference leak when encountering error during compilation of function body.
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 5a0292646b5..c2fcf096fba 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2276,7 +2276,7 @@ compiler_function(struct compiler *c, stmt_ty s, int is_async)
c->u->u_posonlyargcount = asdl_seq_LEN(args->posonlyargs);
c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
for (i = docstring ? 1 : 0; i < asdl_seq_LEN(body); i++) {
- VISIT(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
+ VISIT_IN_SCOPE(c, stmt, (stmt_ty)asdl_seq_GET(body, i));
}
co = assemble(c, 1);
qualname = c->u->u_qualname;
@@ -5533,18 +5533,24 @@ assemble_init(struct assembler *a, int nblocks, int firstlineno)
{
memset(a, 0, sizeof(struct assembler));
a->a_prevlineno = a->a_lineno = firstlineno;
+ a->a_lnotab = NULL;
a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
- if (!a->a_bytecode)
- return 0;
+ if (a->a_bytecode == NULL) {
+ goto error;
+ }
a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
- if (!a->a_lnotab)
- return 0;
+ if (a->a_lnotab == NULL) {
+ goto error;
+ }
if ((size_t)nblocks > SIZE_MAX / sizeof(basicblock *)) {
PyErr_NoMemory();
- return 0;
+ goto error;
}
-
return 1;
+error:
+ Py_XDECREF(a->a_bytecode);
+ Py_XDECREF(a->a_lnotab);
+ return 0;
}
static void