Prevent joypad objects being destroyed before their pointers are being

NULLed. Another thread could access a "half destroyed" object before
This commit is contained in:
twinaphex 2021-08-29 18:06:08 +02:00
parent 46fb61bede
commit f1f3998d28

View File

@ -21921,16 +21921,24 @@ void joypad_driver_reinit(void *data, const char *joypad_driver_name)
return; return;
if (input_driver_st->primary_joypad) if (input_driver_st->primary_joypad)
input_driver_st->primary_joypad->destroy(); {
input_driver_st->primary_joypad = NULL; const input_device_driver_t *tmp = input_driver_st->primary_joypad;
input_driver_st->primary_joypad = NULL;
tmp->destroy();
}
#ifdef HAVE_MFI #ifdef HAVE_MFI
if (input_driver_st->secondary_joypad) if (input_driver_st->secondary_joypad)
input_driver_st->secondary_joypad->destroy(); {
input_driver_st->secondary_joypad = NULL; const input_device_driver_t *tmp = input_driver_st->secondary_joypad;
input_driver_st->secondary_joypad = NULL;
tmp->destroy();
}
#endif #endif
input_driver_st->primary_joypad = input_joypad_init_driver(joypad_driver_name, data); if (!input_driver_st->primary_joypad)
input_driver_st->primary_joypad = input_joypad_init_driver(joypad_driver_name, data);
#ifdef HAVE_MFI #ifdef HAVE_MFI
input_driver_st->secondary_joypad = input_joypad_init_driver("mfi", data); if (!input_driver_st->secondary_joypad)
input_driver_st->secondary_joypad = input_joypad_init_driver("mfi", data);
#endif #endif
} }
@ -24840,16 +24848,18 @@ static void input_keys_pressed(
void input_driver_init_joypads(void) void input_driver_init_joypads(void)
{ {
struct rarch_state *p_rarch = &rarch_st; struct rarch_state *p_rarch = &rarch_st;
input_driver_state_t *input_driver_st = &p_rarch->input_driver_state; input_driver_state_t *input_driver_st = &p_rarch->input_driver_state;
settings_t *settings = p_rarch->configuration_settings; settings_t *settings = p_rarch->configuration_settings;
input_driver_st->primary_joypad = input_joypad_init_driver( if (!input_driver_st->primary_joypad)
input_driver_st->primary_joypad = input_joypad_init_driver(
settings->arrays.input_joypad_driver, settings->arrays.input_joypad_driver,
input_driver_st->current_data); input_driver_st->current_data);
#ifdef HAVE_MFI #ifdef HAVE_MFI
input_driver_st->secondary_joypad = input_joypad_init_driver( if (!input_driver_st->secondary_joypad)
"mfi", input_driver_st->secondary_joypad = input_joypad_init_driver(
input_driver_st->current_data); "mfi",
input_driver_st->current_data);
#endif #endif
} }
@ -29808,10 +29818,10 @@ static void video_driver_free_hw_context(struct rarch_state *p_rarch)
static void video_driver_free_internal(struct rarch_state *p_rarch) static void video_driver_free_internal(struct rarch_state *p_rarch)
{ {
input_driver_state_t *input_driver_st = &p_rarch->input_driver_state; input_driver_state_t *input_driver_st = &p_rarch->input_driver_state;
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
bool is_threaded = VIDEO_DRIVER_IS_THREADED_INTERNAL(); bool is_threaded = VIDEO_DRIVER_IS_THREADED_INTERNAL();
#endif #endif
#ifdef HAVE_VIDEO_LAYOUT #ifdef HAVE_VIDEO_LAYOUT
@ -29829,12 +29839,18 @@ static void video_driver_free_internal(struct rarch_state *p_rarch)
if (input_driver_st->current_driver->free) if (input_driver_st->current_driver->free)
input_driver_st->current_driver->free(input_driver_st->current_data); input_driver_st->current_driver->free(input_driver_st->current_data);
if (input_driver_st->primary_joypad) if (input_driver_st->primary_joypad)
input_driver_st->primary_joypad->destroy(); {
input_driver_st->primary_joypad = NULL; const input_device_driver_t *tmp = input_driver_st->primary_joypad;
input_driver_st->primary_joypad = NULL;
tmp->destroy();
}
#ifdef HAVE_MFI #ifdef HAVE_MFI
if (input_driver_st->secondary_joypad) if (input_driver_st->secondary_joypad)
input_driver_st->secondary_joypad->destroy(); {
input_driver_st->secondary_joypad = NULL; const input_device_driver_t *tmp = input_driver_st->sec_joypad;
input_driver_st->secondary_joypad = NULL;
tmp->destroy();
}
#endif #endif
p_rarch->keyboard_mapping_blocked = false; p_rarch->keyboard_mapping_blocked = false;
p_rarch->input_driver_state.current_data = NULL; p_rarch->input_driver_state.current_data = NULL;