patch "staging: bcm2835-audio: Fix memory corruption" added to staging-linus
Subsystems (4)
This is a note to let you know that I've just added the patch titled
staging: bcm2835-audio: Fix memory corruption
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
c97d96b4e612c7dc1b37d7afc61b598a9a25994dMon Sep 17 00:00:00 2001
From: Phil Elwell <[email protected]>
Date: Sun, 24 Sep 2017 15:20:49 +0100
Subject: staging: bcm2835-audio: Fix memory corruption
The previous commit (0adbfd46) fixed a memory leak but also freed a block in the success case, causing a stale pointer to be used with potentially fatal results. Only free the vchi_instance block in the case that vchi_connect fails; once connected, the instance is retained for subsequent connections.
Simplifying the code by removing a bunch of gotos and returning errors directly.
--- .../vc04_services/bcm2835-audio/bcm2835-vchiq.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)
drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c +7 -12
@@ -390,8 +390,7 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_stream __func__, instance); instance->alsa_stream = alsa_stream; alsa_stream->instance = instance; - ret =0 ;// xxx todo -1; - goto err_free_mem; +return 0 ; }/* Initialize and create a VCHI connection */
@@ -401,16 +400,15 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_streamLOG_ERR ("%s: failed to initialise VCHI instance (ret=%d)\n" , __func__, ret); - ret = -EIO ; - goto err_free_mem; +return -EIO ; } ret =vchi_connect (NULL ,0 , vchi_instance);if (ret) {LOG_ERR ("%s: failed to connect VCHI instance (ret=%d)\n" , __func__, ret); - ret = -EIO ; - goto err_free_mem; +kfree (vchi_instance); +return -EIO ; } initted =1 ; }
@@ -421,19 +419,16 @@ static int bcm2835_audio_open_connection(struct bcm2835_alsa_stream *alsa_streamif (IS_ERR (instance)) {LOG_ERR ("%s: failed to initialize audio service\n" , __func__); - ret =PTR_ERR (instance); - goto err_free_mem; +/* vchi_instance is retained for use the next time. */ +return PTR_ERR (instance); } instance->alsa_stream = alsa_stream; alsa_stream->instance = instance;LOG_DBG (" success !\n" ); - ret =0 ; -err_free_mem: -kfree (vchi_instance); -return ret; +return 0 ; }int bcm2835_audio_open (struct bcm2835_alsa_stream *alsa_stream)
Signature · 1 line
2.14.2