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

Skip to content

Commit 44bf57a

Browse files
authored
bpo-42882: _PyRuntimeState_Init() leaves unicode next_index unchanged (GH-24193)
Fix the _PyUnicode_FromId() function (_Py_IDENTIFIER(var) API) when Py_Initialize() / Py_Finalize() is called multiple times: preserve _PyRuntime.unicode_ids.next_index value. Use _PyRuntimeState_INIT macro instead memset(0) to reset _PyRuntimeState members to zero.
1 parent fb35fa4 commit 44bf57a

File tree

3 files changed

+11
-1
lines changed

3 files changed

+11
-1
lines changed

Include/internal/pycore_runtime.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ typedef struct _Py_AuditHookEntry {
5151

5252
struct _Py_unicode_runtime_ids {
5353
PyThread_type_lock lock;
54+
// next_index value must be preserved when Py_Initialize()/Py_Finalize()
55+
// is called multiple times: see _PyUnicode_FromId() implementation.
5456
Py_ssize_t next_index;
5557
};
5658

@@ -107,6 +109,8 @@ typedef struct pyruntimestate {
107109

108110
PyPreConfig preconfig;
109111

112+
// Audit values must be preserved when Py_Initialize()/Py_Finalize()
113+
// is called multiple times.
110114
Py_OpenCodeHookFunction open_code_hook;
111115
void *open_code_userdata;
112116
_Py_AuditHookEntry *audit_hook_head;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix the :c:func:`_PyUnicode_FromId` function (_Py_IDENTIFIER(var) API) when
2+
:c:func:`Py_Initialize` / :c:func:`Py_Finalize` is called multiple times:
3+
preserve ``_PyRuntime.unicode_ids.next_index`` value.

Python/pystate.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
5454
void *open_code_hook = runtime->open_code_hook;
5555
void *open_code_userdata = runtime->open_code_userdata;
5656
_Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
57+
// bpo-42882: Preserve next_index value if Py_Initialize()/Py_Finalize()
58+
// is called multiple times.
59+
int64_t unicode_next_index = runtime->unicode_ids.next_index;
5760

5861
memset(runtime, 0, sizeof(*runtime));
5962

@@ -90,7 +93,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
9093
if (runtime->unicode_ids.lock == NULL) {
9194
return _PyStatus_NO_MEMORY();
9295
}
93-
runtime->unicode_ids.next_index = 0;
96+
runtime->unicode_ids.next_index = unicode_next_index;
9497

9598
return _PyStatus_OK();
9699
}

0 commit comments

Comments
 (0)