@@ -239,9 +239,11 @@ static const PyConfigSpec PYPRECONFIG_SPEC[] = {
239239
240240
241241// Forward declarations
242- static PyObject *
243- config_get (const PyConfig * config , const PyConfigSpec * spec ,
244- int use_sys );
242+ static PyObject * config_get (const PyConfig * config , const PyConfigSpec * spec ,
243+ int use_sys );
244+ static void initconfig_free_wstr (wchar_t * member );
245+ static void initconfig_free_wstr_list (PyWideStringList * list );
246+ static void initconfig_free_config (const PyConfig * config );
245247
246248
247249/* --- Command line options --------------------------------------- */
@@ -3725,6 +3727,8 @@ PyInitConfig_Free(PyInitConfig *config)
37253727 if (config == NULL ) {
37263728 return ;
37273729 }
3730+
3731+ initconfig_free_config (& config -> config );
37283732 free (config -> err_msg );
37293733 free (config );
37303734}
@@ -4093,13 +4097,51 @@ PyInitConfig_SetStr(PyInitConfig *config, const char *name, const char* value)
40934097}
40944098
40954099
4100+ static void
4101+ initconfig_free_wstr (wchar_t * member )
4102+ {
4103+ if (member ) {
4104+ free (member );
4105+ }
4106+ }
4107+
4108+
4109+ static void
4110+ initconfig_free_wstr_list (PyWideStringList * list )
4111+ {
4112+ for (Py_ssize_t i = 0 ; i < list -> length ; i ++ ) {
4113+ free (list -> items [i ]);
4114+ }
4115+ free (list -> items );
4116+ }
4117+
4118+
4119+ static void
4120+ initconfig_free_config (const PyConfig * config )
4121+ {
4122+ const PyConfigSpec * spec = PYCONFIG_SPEC ;
4123+ for (; spec -> name != NULL ; spec ++ ) {
4124+ void * member = config_get_spec_member (config , spec );
4125+ if (spec -> type == PyConfig_MEMBER_WSTR
4126+ || spec -> type == PyConfig_MEMBER_WSTR_OPT )
4127+ {
4128+ wchar_t * wstr = * (wchar_t * * )member ;
4129+ initconfig_free_wstr (wstr );
4130+ }
4131+ else if (spec -> type == PyConfig_MEMBER_WSTR_LIST ) {
4132+ initconfig_free_wstr_list (member );
4133+ }
4134+ }
4135+ }
4136+
4137+
40964138static int
4097- _PyWideStringList_FromUTF8 (PyInitConfig * config , PyWideStringList * list ,
4098- Py_ssize_t length , char * const * items )
4139+ initconfig_set_str_list (PyInitConfig * config , PyWideStringList * list ,
4140+ Py_ssize_t length , char * const * items )
40994141{
41004142 PyWideStringList wlist = _PyWideStringList_INIT ;
41014143 size_t size = sizeof (wchar_t * ) * length ;
4102- wlist .items = (wchar_t * * )PyMem_RawMalloc (size );
4144+ wlist .items = (wchar_t * * )malloc (size );
41034145 if (wlist .items == NULL ) {
41044146 config -> status = _PyStatus_NO_MEMORY ();
41054147 return -1 ;
@@ -4108,14 +4150,14 @@ _PyWideStringList_FromUTF8(PyInitConfig *config, PyWideStringList *list,
41084150 for (Py_ssize_t i = 0 ; i < length ; i ++ ) {
41094151 wchar_t * arg = utf8_to_wstr (config , items [i ]);
41104152 if (arg == NULL ) {
4111- _PyWideStringList_Clear (& wlist );
4153+ initconfig_free_wstr_list (& wlist );
41124154 return -1 ;
41134155 }
41144156 wlist .items [i ] = arg ;
41154157 wlist .length ++ ;
41164158 }
41174159
4118- _PyWideStringList_Clear (list );
4160+ initconfig_free_wstr_list (list );
41194161 * list = wlist ;
41204162 return 0 ;
41214163}
@@ -4136,7 +4178,7 @@ PyInitConfig_SetStrList(PyInitConfig *config, const char *name,
41364178 return -1 ;
41374179 }
41384180 PyWideStringList * list = raw_member ;
4139- if (_PyWideStringList_FromUTF8 (config , list , length , items ) < 0 ) {
4181+ if (initconfig_set_str_list (config , list , length , items ) < 0 ) {
41404182 return -1 ;
41414183 }
41424184
0 commit comments