diff mbox

iio: adc: meson-saradc: unlock on error in meson_sar_adc_lock()

Message ID 20180308093153.GB16525@mwanda (mailing list archive)
State New, archived
Headers show

Commit Message

Dan Carpenter March 8, 2018, 9:31 a.m. UTC
The meson_sar_adc_lock() function is not supposed to hold the
"indio_dev->mlock" on the error path.

Fixes: 3adbf3427330 ("iio: adc: add a driver for the SAR ADC found in Amlogic Meson SoCs")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Jonathan Cameron March 10, 2018, 3:15 p.m. UTC | #1
On Thu, 8 Mar 2018 12:31:53 +0300
Dan Carpenter <dan.carpenter@oracle.com> wrote:

> The meson_sar_adc_lock() function is not supposed to hold the
> "indio_dev->mlock" on the error path.
> 
> Fixes: 3adbf3427330 ("iio: adc: add a driver for the SAR ADC found in Amlogic Meson SoCs")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> 
Applied to the fixes-togreg branch of iio.git and marked for stable.

Thanks

Jonathan

> diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
> index 29fa7736d80c..ede955d9b2a4 100644
> --- a/drivers/iio/adc/meson_saradc.c
> +++ b/drivers/iio/adc/meson_saradc.c
> @@ -462,8 +462,10 @@ static int meson_sar_adc_lock(struct iio_dev *indio_dev)
>  			regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val);
>  		} while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--);
>  
> -		if (timeout < 0)
> +		if (timeout < 0) {
> +			mutex_unlock(&indio_dev->mlock);
>  			return -ETIMEDOUT;
> +		}
>  	}
>  
>  	return 0;

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Martin Blumenstingl March 12, 2018, 8:43 p.m. UTC | #2
Hi Dan,

On Thu, Mar 8, 2018 at 10:31 AM, Dan Carpenter <dan.carpenter@oracle.com> wrote:
> The meson_sar_adc_lock() function is not supposed to hold the
> "indio_dev->mlock" on the error path.
>
> Fixes: 3adbf3427330 ("iio: adc: add a driver for the SAR ADC found in Amlogic Meson SoCs")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Martin Blumenstingl<martin.blumenstingl@googlemail.com>

(even if I might be too late already since Jonathan already applied this patch)

thank you for finding and fixing this!
out of curiosity: did you find this with some tool (sparse?) or by
looking at the code?


Regards
Martin
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dan Carpenter March 13, 2018, 8:16 a.m. UTC | #3
On Mon, Mar 12, 2018 at 09:43:19PM +0100, Martin Blumenstingl wrote:
> Hi Dan,
> 
> On Thu, Mar 8, 2018 at 10:31 AM, Dan Carpenter <dan.carpenter@oracle.com> wrote:
> > The meson_sar_adc_lock() function is not supposed to hold the
> > "indio_dev->mlock" on the error path.
> >
> > Fixes: 3adbf3427330 ("iio: adc: add a driver for the SAR ADC found in Amlogic Meson SoCs")
> > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> Acked-by: Martin Blumenstingl<martin.blumenstingl@googlemail.com>
> 
> (even if I might be too late already since Jonathan already applied this patch)
> 
> thank you for finding and fixing this!
> out of curiosity: did you find this with some tool (sparse?) or by
> looking at the code?
> 

This was some Smatch stuff that I haven't pushed.  I re-wrote the
locking check to use cross function analysis, and it actually warns
about the callers not meson_sar_adc_lock().  That code works ok
basically for locks but it generates a ton of false positives about
double unlocks so I haven't pushed it.

regards,
dan carpenter

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/iio/adc/meson_saradc.c b/drivers/iio/adc/meson_saradc.c
index 29fa7736d80c..ede955d9b2a4 100644
--- a/drivers/iio/adc/meson_saradc.c
+++ b/drivers/iio/adc/meson_saradc.c
@@ -462,8 +462,10 @@  static int meson_sar_adc_lock(struct iio_dev *indio_dev)
 			regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val);
 		} while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--);
 
-		if (timeout < 0)
+		if (timeout < 0) {
+			mutex_unlock(&indio_dev->mlock);
 			return -ETIMEDOUT;
+		}
 	}
 
 	return 0;