From 5070fe84194dab112c2ead79b9993598dff62de3 Mon Sep 17 00:00:00 2001 From: derselbst Date: Thu, 23 Jan 2020 14:43:42 +0100 Subject: [PATCH] Attempt to fix double free in jack driver --- src/drivers/fluid_jack.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/drivers/fluid_jack.c b/src/drivers/fluid_jack.c index 1d85994f..d81d934a 100644 --- a/src/drivers/fluid_jack.c +++ b/src/drivers/fluid_jack.c @@ -170,21 +170,25 @@ new_fluid_jack_client(fluid_settings_t *settings, int isaudio, void *driver) ((!isaudio && last_client->midi_driver == NULL) || (isaudio && last_client->audio_driver == NULL))) { client_ref = last_client; - last_client = NULL; /* No more pairing for this client */ /* Register ports */ - if(fluid_jack_client_register_ports(driver, isaudio, client_ref->client, settings) != FLUID_OK) + if(fluid_jack_client_register_ports(driver, isaudio, client_ref->client, settings) == FLUID_OK) { - goto error_recovery; - } + last_client = NULL; /* No more pairing for this client */ - if(isaudio) - { - fluid_atomic_pointer_set(&client_ref->audio_driver, driver); + if(isaudio) + { + fluid_atomic_pointer_set(&client_ref->audio_driver, driver); + } + else + { + fluid_atomic_pointer_set(&client_ref->midi_driver, driver); + } } else { - fluid_atomic_pointer_set(&client_ref->midi_driver, driver); + // do not free client_ref and do not goto error_recovery + // client_ref is being used by another audio or midi driver. Freeing it here will create a double free. } fluid_mutex_unlock(last_client_mutex); /* -- unlock last_client */