diff options
author | Tuomas Tynkkynen <tuomas@tuxera.com> | 2018-07-13 00:54:17 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-07-13 11:37:34 +0200 |
commit | 678c5b119307c40f9a17152512f9c949d0ec7292 (patch) | |
tree | edc06dca3bdf6d8810815332d8e15f23033ded92 /drivers/staging/vc04_services | |
parent | 4feb0f375f030050906c834fde8bf80ac4a4571b (diff) | |
download | linux-stable-678c5b119307c40f9a17152512f9c949d0ec7292.tar.gz linux-stable-678c5b119307c40f9a17152512f9c949d0ec7292.tar.bz2 linux-stable-678c5b119307c40f9a17152512f9c949d0ec7292.zip |
staging: bcm2835-audio: Don't leak workqueue if open fails
Currently, if bcm2835_audio_open() fails partway, the allocated
workqueue is leaked. Avoid that.
While at it, propagate the return value of
bcm2835_audio_open_connection() on failure instead of returning -1.
Signed-off-by: Tuomas Tynkkynen <tuomas@tuxera.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/vc04_services')
-rw-r--r-- | drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c index 8c4345cb44af..868e2d6aaf1b 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c @@ -428,16 +428,16 @@ int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream) return -ENOMEM; ret = bcm2835_audio_open_connection(alsa_stream); - if (ret) { - ret = -1; - goto exit; - } + if (ret) + goto free_wq; + instance = alsa_stream->instance; LOG_DBG(" instance (%p)\n", instance); if (mutex_lock_interruptible(&instance->vchi_mutex)) { LOG_DBG("Interrupted whilst waiting for lock on (%d)\n", instance->num_connections); - return -EINTR; + ret = -EINTR; + goto free_wq; } vchi_service_use(instance->vchi_handle[0]); @@ -460,7 +460,11 @@ int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream) unlock: vchi_service_release(instance->vchi_handle[0]); mutex_unlock(&instance->vchi_mutex); -exit: + +free_wq: + if (ret) + destroy_workqueue(alsa_stream->my_wq); + return ret; } |