Skip to content

Commit 34ed40f

Browse files
authored
[3.7] bpo-34408: Prevent a null pointer dereference and resource leakage in PyInterpreterState_New() (GH-8767) (GH-13237)
* 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. (cherry picked from commit 95d630e) Co-authored-by: Pablo Galindo <[email protected]>
1 parent 069a5b4 commit 34ed40f

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed
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
@@ -167,23 +167,27 @@ PyInterpreterState_New(void)
167167
interp->pyexitmodule = NULL;
168168

169169
HEAD_LOCK();
170-
interp->next = _PyRuntime.interpreters.head;
171-
if (_PyRuntime.interpreters.main == NULL) {
172-
_PyRuntime.interpreters.main = interp;
173-
}
174-
_PyRuntime.interpreters.head = interp;
175170
if (_PyRuntime.interpreters.next_id < 0) {
176171
/* overflow or Py_Initialize() not called! */
177172
PyErr_SetString(PyExc_RuntimeError,
178173
"failed to get an interpreter ID");
179-
/* XXX deallocate! */
174+
PyMem_RawFree(interp);
180175
interp = NULL;
181176
} else {
182177
interp->id = _PyRuntime.interpreters.next_id;
183178
_PyRuntime.interpreters.next_id += 1;
179+
interp->next = _PyRuntime.interpreters.head;
180+
if (_PyRuntime.interpreters.main == NULL) {
181+
_PyRuntime.interpreters.main = interp;
182+
}
183+
_PyRuntime.interpreters.head = interp;
184184
}
185185
HEAD_UNLOCK();
186186

187+
if (interp == NULL) {
188+
return NULL;
189+
}
190+
187191
interp->tstate_next_unique_id = 0;
188192

189193
return interp;

0 commit comments

Comments
 (0)