| From d3fa21c73c391975488818b085b894c2980ea052 Mon Sep 17 00:00:00 2001 |
| From: Alexey Khoroshilov <khoroshilov@ispras.ru> |
| Date: Sat, 22 Sep 2018 00:58:02 +0300 |
| Subject: iio: adc: imx25-gcq: Fix leak of device_node in mx25_gcq_setup_cfgs() |
| |
| From: Alexey Khoroshilov <khoroshilov@ispras.ru> |
| |
| commit d3fa21c73c391975488818b085b894c2980ea052 upstream. |
| |
| Leaving for_each_child_of_node loop we should release child device node, |
| if it is not stored for future use. |
| |
| Found by Linux Driver Verification project (linuxtesting.org). |
| |
| JC: I'm not sending this as a quick fix as it's been wrong for years, |
| but good to pick up for stable after the merge window. |
| |
| Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> |
| Fixes: 6df2e98c3ea56 ("iio: adc: Add imx25-gcq ADC driver") |
| Cc: <Stable@vger.kernel.org> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/iio/adc/fsl-imx25-gcq.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/drivers/iio/adc/fsl-imx25-gcq.c |
| +++ b/drivers/iio/adc/fsl-imx25-gcq.c |
| @@ -209,12 +209,14 @@ static int mx25_gcq_setup_cfgs(struct pl |
| ret = of_property_read_u32(child, "reg", ®); |
| if (ret) { |
| dev_err(dev, "Failed to get reg property\n"); |
| + of_node_put(child); |
| return ret; |
| } |
| |
| if (reg >= MX25_NUM_CFGS) { |
| dev_err(dev, |
| "reg value is greater than the number of available configuration registers\n"); |
| + of_node_put(child); |
| return -EINVAL; |
| } |
| |
| @@ -228,6 +230,7 @@ static int mx25_gcq_setup_cfgs(struct pl |
| if (IS_ERR(priv->vref[refp])) { |
| dev_err(dev, "Error, trying to use external voltage reference without a vref-%s regulator.", |
| mx25_gcq_refp_names[refp]); |
| + of_node_put(child); |
| return PTR_ERR(priv->vref[refp]); |
| } |
| priv->channel_vref_mv[reg] = |
| @@ -240,6 +243,7 @@ static int mx25_gcq_setup_cfgs(struct pl |
| break; |
| default: |
| dev_err(dev, "Invalid positive reference %d\n", refp); |
| + of_node_put(child); |
| return -EINVAL; |
| } |
| |
| @@ -254,10 +258,12 @@ static int mx25_gcq_setup_cfgs(struct pl |
| |
| if ((refp & MX25_ADCQ_CFG_REFP_MASK) != refp) { |
| dev_err(dev, "Invalid fsl,adc-refp property value\n"); |
| + of_node_put(child); |
| return -EINVAL; |
| } |
| if ((refn & MX25_ADCQ_CFG_REFN_MASK) != refn) { |
| dev_err(dev, "Invalid fsl,adc-refn property value\n"); |
| + of_node_put(child); |
| return -EINVAL; |
| } |
| |