bpo-36301: Fix Py_Main() memory leaks (GH-12420) · python/cpython@c183444 (original) (raw)

3 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -888,13 +888,13 @@ pymain_main(_PyArgv *args)
888 888 PyInterpreterState *interp;
889 889 err = pymain_init(args, &interp);
890 890 if (_Py_INIT_FAILED(err)) {
891 -_Py_ExitInitError(err);
891 +goto exit_init_error;
892 892 }
893 893
894 894 int exitcode = 0;
895 895 err = pymain_run_python(interp, &exitcode);
896 896 if (_Py_INIT_FAILED(err)) {
897 -_Py_ExitInitError(err);
897 +goto exit_init_error;
898 898 }
899 899
900 900 if (Py_FinalizeEx() < 0) {
@@ -910,6 +910,10 @@ pymain_main(_PyArgv *args)
910 910 }
911 911
912 912 return exitcode;
913 +
914 +exit_init_error:
915 +pymain_free();
916 +_Py_ExitInitError(err);
913 917 }
914 918
915 919
Original file line number Diff line number Diff line change
@@ -149,7 +149,12 @@ _PyPathConfig_SetGlobal(const _PyPathConfig *config)
149 149 void
150 150 _PyPathConfig_ClearGlobal(void)
151 151 {
152 +PyMemAllocatorEx old_alloc;
153 +_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
154 +
152 155 _PyPathConfig_Clear(&_Py_path_config);
156 +
157 +PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
153 158 }
154 159
155 160
Original file line number Diff line number Diff line change
@@ -758,6 +758,7 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args)
758 758 done:
759 759 if (init_ctype_locale != NULL) {
760 760 setlocale(LC_CTYPE, init_ctype_locale);
761 +PyMem_RawFree(init_ctype_locale);
761 762 }
762 763 _PyPreConfig_Clear(&save_config);
763 764 Py_UTF8Mode = init_utf8_mode ;