Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 95d630e

Browse files
authored
bpo-34408: Prevent a null pointer dereference and resource leakage in PyInterpreterState_New() (GH-8767)
* A pointer in `PyInterpreterState_New()` could have been `NULL` when being dereferenced. * Memory was leaked in `PyInterpreterState_New()` when taking some error-handling code path.
1 parent 745c0f3 commit 95d630e

2 files changed

Lines changed: 11 additions & 6 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Prevent a null pointer dereference and resource leakage in ``PyInterpreterState_New()``.

Python/pystate.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,23 +172,27 @@ PyInterpreterState_New(void)
172172
interp->pyexitmodule = NULL;
173173

174174
HEAD_LOCK();
175-
interp->next = _PyRuntime.interpreters.head;
176-
if (_PyRuntime.interpreters.main == NULL) {
177-
_PyRuntime.interpreters.main = interp;
178-
}
179-
_PyRuntime.interpreters.head = interp;
180175
if (_PyRuntime.interpreters.next_id < 0) {
181176
/* overflow or Py_Initialize() not called! */
182177
PyErr_SetString(PyExc_RuntimeError,
183178
"failed to get an interpreter ID");
184-
/* XXX deallocate! */
179+
PyMem_RawFree(interp);
185180
interp = NULL;
186181
} else {
187182
interp->id = _PyRuntime.interpreters.next_id;
188183
_PyRuntime.interpreters.next_id += 1;
184+
interp->next = _PyRuntime.interpreters.head;
185+
if (_PyRuntime.interpreters.main == NULL) {
186+
_PyRuntime.interpreters.main = interp;
187+
}
188+
_PyRuntime.interpreters.head = interp;
189189
}
190190
HEAD_UNLOCK();
191191

192+
if (interp == NULL) {
193+
return NULL;
194+
}
195+
192196
interp->tstate_next_unique_id = 0;
193197

194198
return interp;

0 commit comments

Comments
 (0)