Skip to content

Commit

Permalink
bpo-24618: Add a check in the code constructor. (GH-8283)
Browse files Browse the repository at this point in the history
Check that the size of the varnames tuple is enough at least for all arguments.
  • Loading branch information
serhiy-storchaka authored Jul 16, 2018
1 parent 15c7b2a commit bd47384
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fixed reading invalid memory when create the code object with too small
varnames tuple or too large argument counts.
18 changes: 15 additions & 3 deletions Objects/codeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ PyCode_New(int argcount, int kwonlyargcount,
{
PyCodeObject *co;
Py_ssize_t *cell2arg = NULL;
Py_ssize_t i, n_cellvars;
Py_ssize_t i, n_cellvars, n_varnames, total_args;

/* Check argument types */
if (argcount < 0 || kwonlyargcount < 0 || nlocals < 0 ||
Expand Down Expand Up @@ -138,10 +138,22 @@ PyCode_New(int argcount, int kwonlyargcount,
flags &= ~CO_NOFREE;
}

n_varnames = PyTuple_GET_SIZE(varnames);
if (argcount <= n_varnames && kwonlyargcount <= n_varnames) {
/* Never overflows. */
total_args = (Py_ssize_t)argcount + (Py_ssize_t)kwonlyargcount +
((flags & CO_VARARGS) != 0) + ((flags & CO_VARKEYWORDS) != 0);
}
else {
total_args = n_varnames + 1;
}
if (total_args > n_varnames) {
PyErr_SetString(PyExc_ValueError, "code: varnames is too small");
return NULL;
}

/* Create mapping between cells and arguments if needed. */
if (n_cellvars) {
Py_ssize_t total_args = argcount + kwonlyargcount +
((flags & CO_VARARGS) != 0) + ((flags & CO_VARKEYWORDS) != 0);
bool used_cell2arg = false;
cell2arg = PyMem_NEW(Py_ssize_t, n_cellvars);
if (cell2arg == NULL) {
Expand Down

0 comments on commit bd47384

Please sign in to comment.