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 ; |