closes bpo-38124: Fix bounds check in PyState_AddModule. (GH-16007)
The >=, checking whether a module index was in already in the module-by-index list, needed to be strict. Also, fold nested ifs into one and fix some bad spacing.
This commit is contained in:
parent
ee536b2020
commit
39de95b746
|
@ -0,0 +1,2 @@
|
||||||
|
Fix an off-by-one error in PyState_AddModule that could cause out-of-bounds
|
||||||
|
memory access.
|
|
@ -684,7 +684,7 @@ _PyState_AddModule(PyObject* module, struct PyModuleDef* def)
|
||||||
if (!state->modules_by_index)
|
if (!state->modules_by_index)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
|
while (PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
|
||||||
if (PyList_Append(state->modules_by_index, Py_None) < 0)
|
if (PyList_Append(state->modules_by_index, Py_None) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
Py_INCREF(module);
|
Py_INCREF(module);
|
||||||
|
@ -702,14 +702,12 @@ PyState_AddModule(PyObject* module, struct PyModuleDef* def)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
index = def->m_base.m_index;
|
index = def->m_base.m_index;
|
||||||
if (state->modules_by_index) {
|
if (state->modules_by_index &&
|
||||||
if(PyList_GET_SIZE(state->modules_by_index) >= index) {
|
index < PyList_GET_SIZE(state->modules_by_index) &&
|
||||||
if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
|
module == PyList_GET_ITEM(state->modules_by_index, index)) {
|
||||||
Py_FatalError("PyState_AddModule: Module already added!");
|
Py_FatalError("PyState_AddModule: Module already added!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
return _PyState_AddModule(module, def);
|
return _PyState_AddModule(module, def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue