Skip to contentSkip to conversation

iio: dac: mcp4922: fix error handling in mcp4922_write_raw

PATCH In review Marcus Folkesson 2 participants 2 messages Aug 24, 2018 – Aug 25, 2018 IIO

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 iio: dac: mcp4922: fix error handling in mcp4922_write_raw

Do not try to write negative values and make sure that the write goes well.

---
 drivers/iio/dac/mcp4922.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/iio/dac/mcp4922.c +8 -3
index bf9aa3fc0534..b5190d1dae8e 100644
@@ -94,17 +94,22 @@ static int mcp4922_write_raw(struct iio_dev *indio_dev,
 		long mask)
 {
 	struct mcp4922_state *state = iio_priv(indio_dev);
+	int ret;
 
 	if (val2 != 0)
 		return -EINVAL;
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
-		if (val > GENMASK(chan->scan_type.realbits-1, 0))
+		if (val < 0 || val > GENMASK(chan->scan_type.realbits - 1, 0))
 			return -EINVAL;
 		val <<= chan->scan_type.shift;
-		state->value[chan->channel] = val;
-		return mcp4922_spi_write(state, chan->channel, val);
+
+		ret = mcp4922_spi_write(state, chan->channel, val);
+		if (!ret)
+			state->value[chan->channel] = val;
+		return ret;
+
 	default:
 		return -EINVAL;
 	}
Signature · 1 line
2.18.0
maintainer
#1 lore raw
Quoted 2 lines · On Fri, 24 Aug 2018 22:24:40 +0200 Marcus Folkesson…

Do not try to write negative values and make sure that the write goes well.

+CC Michael as it's his driver.

I'll take this as it 'appears' straight forward but I won't be pushing it out as a non rebasing branch for a few days if I've missed anything.

Applied to the togreg branch of iio.git and pushed out for now as testing for the autobuilders to play with it.

Thanks,

Jonathan

Quoted 35 lines
---
 drivers/iio/dac/mcp4922.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/iio/dac/mcp4922.c +8 -3
index bf9aa3fc0534..b5190d1dae8e 100644
@@ -94,17 +94,22 @@ static int mcp4922_write_raw(struct iio_dev *indio_dev,
 		long mask)
 {
 	struct mcp4922_state *state = iio_priv(indio_dev);
+	int ret;
 
 	if (val2 != 0)
 		return -EINVAL;
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
-		if (val > GENMASK(chan->scan_type.realbits-1, 0))
+		if (val < 0 || val > GENMASK(chan->scan_type.realbits - 1, 0))
 			return -EINVAL;
 		val <<= chan->scan_type.shift;
-		state->value[chan->channel] = val;
-		return mcp4922_spi_write(state, chan->channel, val);
+
+		ret = mcp4922_spi_write(state, chan->channel, val);
+		if (!ret)
+			state->value[chan->channel] = val;
+		return ret;
+
 	default:
 		return -EINVAL;
 	}