[alsa-devel] [PATCH] ASoC: Fix cs4270 error path

Jean Delvare khali at linux-fr.org
Mon Sep 22 14:29:51 CEST 2008


Timur,

Any news about this fix? This should go in kernel 2.6.28.

On Sun, 31 Aug 2008 14:42:14 +0200, Jean Delvare wrote:
> The error path in cs4270_probe/cs4270_remove is pretty broken:
> * If cs4270_probe fails, codec is leaked.
> * If snd_soc_register_card fails, cs4270_i2c_driver stays registered.
> * If I2C support is enabled but no I2C device is found, i2c_del_driver
>   is never called (neither in cs4270_probe nor in cs4270_remove.)
> 
> Fix the first 2 problems by implementing a clean error path in
> cs4270_probe and jumping to its labels as needed. Fix the 3rd problem
> by removing the condition to call i2c_del_driver in cs4270_remove.
> 
> Signed-off-by: Jean Delvare <khali at linux-fr.org>
> ---
> Timur, can you please review and test this patch? I do not have the
> hardware so I couldn't test it myself.
> 
>  sound/soc/codecs/cs4270.c |   25 ++++++++++++++++++-------
>  1 file changed, 18 insertions(+), 7 deletions(-)
> 
> --- linux-2.6.27-rc5.orig/sound/soc/codecs/cs4270.c	2008-08-31 13:59:17.000000000 +0200
> +++ linux-2.6.27-rc5/sound/soc/codecs/cs4270.c	2008-08-31 14:23:34.000000000 +0200
> @@ -727,7 +727,7 @@ static int cs4270_probe(struct platform_
>  	ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
>  	if (ret < 0) {
>  		printk(KERN_ERR "cs4270: failed to create PCMs\n");
> -		return ret;
> +		goto error_free_codec;
>  	}
>  
>  #ifdef USE_I2C
> @@ -736,8 +736,7 @@ static int cs4270_probe(struct platform_
>  	ret = i2c_add_driver(&cs4270_i2c_driver);
>  	if (ret) {
>  		printk(KERN_ERR "cs4270: failed to attach driver");
> -		snd_soc_free_pcms(socdev);
> -		return ret;
> +		goto error_free_pcms;
>  	}
>  
>  	/* Did we find a CS4270 on the I2C bus? */
> @@ -759,10 +758,23 @@ static int cs4270_probe(struct platform_
>  	ret = snd_soc_register_card(socdev);
>  	if (ret < 0) {
>  		printk(KERN_ERR "cs4270: failed to register card\n");
> -		snd_soc_free_pcms(socdev);
> -		return ret;
> +		goto error_del_driver;
>  	}
>  
> +	return 0;
> +
> +error_del_driver:
> +#ifdef USE_I2C
> +	i2c_del_driver(&cs4270_i2c_driver);
> +
> +error_free_pcms:
> +#endif
> +	snd_soc_free_pcms(socdev);
> +
> +error_free_codec:
> +	kfree(socdev->codec);
> +	socdev->codec = NULL;
> +
>  	return ret;
>  }
>  
> @@ -773,8 +785,7 @@ static int cs4270_remove(struct platform
>  	snd_soc_free_pcms(socdev);
>  
>  #ifdef USE_I2C
> -	if (socdev->codec->control_data)
> -		i2c_del_driver(&cs4270_i2c_driver);
> +	i2c_del_driver(&cs4270_i2c_driver);
>  #endif
>  
>  	kfree(socdev->codec);
> 
> 


-- 
Jean Delvare


More information about the Alsa-devel mailing list