iio: Fix unsafe buffer attributes
Subsystems (7)
v3 cover iio: Fix unsafe buffer attributes
IIO The iio_triggered_buffer_setup_ext() has been changed to expect that all attributes given in buffer_attrs array are device-attributes. This expectation has not been forced by the API and not all existing users were checked. Some drivers do register attributes created by IIO_CONST_ATTR().
The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid address.
First 4 patches in the series aim to address both the drivers using IIO_CONST_ATTR(). These patches should be backportable. Please note that these patches have not been tested in the HW so testing/reviewing is highly appreciated.
Following 4 (patches 5 ... 9) contain a minor simplification adding a macro for omitting open-coding of dummy attribute show functions.
I am not super happy about the new macro IIO_STATIC_CONST_DEVICE_ATTR() which unconditionally creates a static function and a static struct iio_dev_attr. OTOH, I do believe static function + static struct iio_dev_attr should be the right thing to do for majority of use cases.
The last patch in the series (patch 10) aims to change the function signatures so that similar issues would be avoided in the future.
Here we also change the struct iio_buffer to have array of pointers to iio_dev_attr in order to avoid yet another copying in side the iio_triggered_buffer_setup_ext(). This change appeared to be somewhat intrusive - and as I lack the hardware to do thorough testing I added the request for testing tag here. Especially testing of adi-axi-adc would be highly appreciated as it is using the industrialio-buffer-dmaengine.
Changelog v3:
- Split the series to allow easier backport and review. This also allows merging the smaller fixes with less of a risk for crashing and burning everything :)
Changelog v2:
- fix also the cros_ec_sensors_core.c
- fix also the industrialio-buffer-dmaengine.c
- add RFT + this cover-letter.
--
Matti Vaittinen (10):
iio: adxl367: Fix unsafe buffer attributes
iio: adxl372: Fix unsafe buffer attributes
iio: bmc150-accel-core: Fix unsafe buffer attributes
iio: at91-sama5d2_adc: Fix unsafe buffer attributes
iio: Add IIO_STATIC_CONST_DEVICE_ATTR
iio: adxl367: Use IIO_STATIC_CONST_DEVICE_ATTR()
iio: adxl372: Use IIO_STATIC_CONST_DEVICE_ATTR()
iio: bmc150-accel-core: Use IIO_STATIC_CONST_DEVICE_ATTR()
iio: at91-sama5d2_adc: Use IIO_STATIC_CONST_DEVICE_ATTR()
iio: Don't silently expect attribute types
drivers/iio/accel/adxl367.c | 16 ++++++++-------- drivers/iio/accel/adxl372.c | 16 ++++++++-------- drivers/iio/accel/bmc150-accel-core.c | 18 +++++++++--------- drivers/iio/adc/at91-sama5d2_adc.c | 16 ++++++++-------- .../iio/buffer/industrialio-buffer-dmaengine.c | 4 ++-- .../iio/buffer/industrialio-triggered-buffer.c | 4 ++-- drivers/iio/buffer/kfifo_buf.c | 2 +- .../cros_ec_sensors/cros_ec_sensors_core.c | 6 +++--- .../common/hid-sensors/hid-sensor-trigger.c | 8 ++++---- drivers/iio/industrialio-buffer.c | 11 +++++++---- include/linux/iio/buffer_impl.h | 2 +- include/linux/iio/kfifo_buf.h | 3 ++- include/linux/iio/sysfs.h | 11 +++++++++++ include/linux/iio/triggered_buffer.h | 6 +++--- 14 files changed, 69 insertions(+), 54 deletions(-)
base-commit: f76349cf41451c5c42a99f18a9163377e4b364ff
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
PATCH v3 1/10 iio: adxl367: Fix unsafe buffer attributes
The devm_iio_kfifo_buffer_setup_ext() was changed by
commit 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr") to silently expect that all attributes given in buffer_attrs array are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created by IIO_CONST_ATTR().
The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Change the IIO_CONST_ATTRs from the driver to IIO_DEVICE_ATTR in order to prevent the invalid memory access.
---
v2 => v3:
Split change to own patch for simpler fix backporting.
--- drivers/iio/accel/adxl367.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
drivers/iio/accel/adxl367.c +18 -5
@@ -1185,17 +1185,30 @@ static ssize_t adxl367_get_fifo_watermark(struct device *dev,return sysfs_emit (buf,"%d\n" , fifo_watermark); } -static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); -static IIO_CONST_ATTR(hwfifo_watermark_max, - __stringify(ADXL367_FIFO_MAX_WATERMARK)); +static ssize_t hwfifo_watermark_min_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,"1" ); +} + +static ssize_t hwfifo_watermark_max_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,__stringify (ADXL367_FIFO_MAX_WATERMARK )); +} + +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, adxl367_get_fifo_watermark, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, adxl367_get_fifo_enabled, NULL, 0);static const struct attribute *adxl367_fifo_attributes[] = { - &iio_const_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_const_attr_hwfifo_watermark_max.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,NULL ,
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Jonathan Cameron
maintainerRe: [PATCH v3 01/10] iio: adxl367: Fix unsafe buffer attributes
Quoted 10 lines · On Mon, 3 Oct 2022 11:10:29 +0300 Matti Vaittinen <[email protected]>…
The
devm_iio_kfifo_buffer_setup_ext()was changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Quoted 5 lines
Change the
IIO_CONST_ATTRsfrom the driver toIIO_DEVICE_ATTRin order to prevent the invalid memory access.Signed-off-by Matti Vaittinen <[email protected]>Fixes 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr")
Seems like a safe enough change to take without additional review. Hence applied to the fixes-togreg branch of iio.git and marked for stable.
Thanks,
Jonathan
Quoted 49 lines
---
v2 => v3:
Split change to own patch for simpler fix backporting.--- drivers/iio/accel/adxl367.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)drivers/iio/accel/adxl367.c +18
-5@@ -1185,17 +1185,30 @@ static ssize_t adxl367_get_fifo_watermark(struct device *dev,return sysfs_emit (buf,"%d\n" , fifo_watermark); } -static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); -static IIO_CONST_ATTR(hwfifo_watermark_max, - __stringify(ADXL367_FIFO_MAX_WATERMARK)); +static ssize_t hwfifo_watermark_min_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,"1" ); +} + +static ssize_t hwfifo_watermark_max_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,__stringify (ADXL367_FIFO_MAX_WATERMARK )); +} + +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, adxl367_get_fifo_watermark, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, adxl367_get_fifo_enabled, NULL, 0);static const struct attribute *adxl367_fifo_attributes[] = { - &iio_const_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_const_attr_hwfifo_watermark_max.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,NULL ,
PATCH v3 2/10 iio: adxl372: Fix unsafe buffer attributes
In reply to Matti VaittinenThe iio_triggered_buffer_setup_ext() was changed by
commit 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr") to silently expect that all attributes given in buffer_attrs array are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created by IIO_CONST_ATTR().
The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Change the IIO_CONST_ATTRs from the driver to IIO_DEVICE_ATTR in order to prevent the invalid memory access.
---
v2 => v3:
Split change to own patch for simpler fix backporting.
--- drivers/iio/accel/adxl372.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
drivers/iio/accel/adxl372.c +18 -5
@@ -998,17 +998,30 @@ static ssize_t adxl372_get_fifo_watermark(struct device *dev,return sprintf (buf,"%d\n" , st->watermark); } -static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); -static IIO_CONST_ATTR(hwfifo_watermark_max, - __stringify(ADXL372_FIFO_SIZE)); +static ssize_t hwfifo_watermark_min_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,"1" ); +} + +static ssize_t hwfifo_watermark_max_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,__stringify (ADXL372_FIFO_SIZE )); +} + +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, adxl372_get_fifo_watermark, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, adxl372_get_fifo_enabled, NULL, 0);static const struct attribute *adxl372_fifo_attributes[] = { - &iio_const_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_const_attr_hwfifo_watermark_max.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,NULL ,
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Re: [PATCH v3 02/10] iio: adxl372: Fix unsafe buffer attributes
Quoted 10 lines · On Mon, 3 Oct 2022 11:10:51 +0300 Matti Vaittinen <[email protected]>…
The
iio_triggered_buffer_setup_ext()was changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Quoted 5 lines
Change the
IIO_CONST_ATTRsfrom the driver toIIO_DEVICE_ATTRin order to prevent the invalid memory access.Signed-off-by Matti Vaittinen <[email protected]>Fixes 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr")
Applied to the fixes-togreg branch of iio.git and marked for stable.
Thanks,
Jonathan
Quoted 49 lines
---
v2 => v3:
Split change to own patch for simpler fix backporting.--- drivers/iio/accel/adxl372.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)drivers/iio/accel/adxl372.c +18
-5@@ -998,17 +998,30 @@ static ssize_t adxl372_get_fifo_watermark(struct device *dev,return sprintf (buf,"%d\n" , st->watermark); } -static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); -static IIO_CONST_ATTR(hwfifo_watermark_max, - __stringify(ADXL372_FIFO_SIZE)); +static ssize_t hwfifo_watermark_min_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,"1" ); +} + +static ssize_t hwfifo_watermark_max_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,__stringify (ADXL372_FIFO_SIZE )); +} + +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, adxl372_get_fifo_watermark, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, adxl372_get_fifo_enabled, NULL, 0);static const struct attribute *adxl372_fifo_attributes[] = { - &iio_const_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_const_attr_hwfifo_watermark_max.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,NULL ,
PATCH v3 3/10 iio: bmc150-accel-core: Fix unsafe buffer attributes
In reply to Matti VaittinenThe iio_triggered_buffer_setup_ext() was changed by
commit 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr") to silently expect that all attributes given in buffer_attrs array are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created by IIO_CONST_ATTR().
The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Change the IIO_CONST_ATTRs from the driver to IIO_DEVICE_ATTR in order to prevent the invalid memory access.
---
v2 => v3:
Split change to own patch for simpler fix backporting.
--- drivers/iio/accel/bmc150-accel-core.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
drivers/iio/accel/bmc150-accel-core.c +18 -5
@@ -925,17 +925,30 @@ static const struct iio_chan_spec_ext_info bmc150_accel_ext_info[] = { { } }; -static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); -static IIO_CONST_ATTR(hwfifo_watermark_max, - __stringify(BMC150_ACCEL_FIFO_LENGTH)); +static ssize_t hwfifo_watermark_min_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,"1" ); +} + +static ssize_t hwfifo_watermark_max_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,__stringify (BMC150_ACCEL_FIFO_LENGTH )); +} + +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, S_IRUGO, bmc150_accel_get_fifo_state, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, S_IRUGO, bmc150_accel_get_fifo_watermark, NULL, 0);static const struct attribute *bmc150_accel_fifo_attributes[] = { - &iio_const_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_const_attr_hwfifo_watermark_max.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,NULL ,
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Re: [PATCH v3 03/10] iio: bmc150-accel-core: Fix unsafe buffer attributes
Quoted 10 lines · On Mon, 3 Oct 2022 11:11:12 +0300 Matti Vaittinen <[email protected]>…
The
iio_triggered_buffer_setup_ext()was changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Quoted 5 lines
Change the
IIO_CONST_ATTRsfrom the driver toIIO_DEVICE_ATTRin order to prevent the invalid memory access.Signed-off-by Matti Vaittinen <[email protected]>Fixes 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr")
Applied to the fixes-togreg branch of iio.git and marked for stable.
Thanks,
Jonathan
Quoted 49 lines
---
v2 => v3:
Split change to own patch for simpler fix backporting.--- drivers/iio/accel/bmc150-accel-core.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)drivers/iio/accel/bmc150-accel-core.c +18
-5@@ -925,17 +925,30 @@ static const struct iio_chan_spec_ext_info bmc150_accel_ext_info[] = { { } }; -static IIO_CONST_ATTR(hwfifo_watermark_min, "1"); -static IIO_CONST_ATTR(hwfifo_watermark_max, - __stringify(BMC150_ACCEL_FIFO_LENGTH)); +static ssize_t hwfifo_watermark_min_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,"1" ); +} + +static ssize_t hwfifo_watermark_max_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,__stringify (BMC150_ACCEL_FIFO_LENGTH )); +} + +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, S_IRUGO, bmc150_accel_get_fifo_state, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, S_IRUGO, bmc150_accel_get_fifo_watermark, NULL, 0);static const struct attribute *bmc150_accel_fifo_attributes[] = { - &iio_const_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_const_attr_hwfifo_watermark_max.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,NULL ,
PATCH v3 4/10 iio: at91-sama5d2_adc: Fix unsafe buffer attributes
In reply to Matti VaittinenThe iio_triggered_buffer_setup_ext() was changed by
commit 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr") to silently expect that all attributes given in buffer_attrs array are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created by IIO_CONST_ATTR().
The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Change the IIO_CONST_ATTRs from the driver to IIO_DEVICE_ATTR in order to prevent the invalid memory access.
---
v2 => v3:
Split change to own patch for simpler fix backporting.
--- drivers/iio/adc/at91-sama5d2_adc.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
drivers/iio/adc/at91-sama5d2_adc.c +18 -5
@@ -1841,13 +1841,26 @@ static ssize_t at91_adc_get_watermark(struct device *dev,return scnprintf (buf,PAGE_SIZE ,"%d\n" , st->dma_st.watermark); } +static ssize_t hwfifo_watermark_min_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,"2" ); +} + +static ssize_t hwfifo_watermark_max_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +return sysfs_emit (buf,"%s\n" ,AT91_HWFIFO_MAX_SIZE_STR ); +} + static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, at91_adc_get_fifo_state, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, at91_adc_get_watermark, NULL, 0); - -static IIO_CONST_ATTR(hwfifo_watermark_min, "2"); -static IIO_CONST_ATTR(hwfifo_watermark_max, AT91_HWFIFO_MAX_SIZE_STR); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); +static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); static IIO_CONST_ATTR(oversampling_ratio_available, __stringify(AT91_OSR_1SAMPLES) " "
@@ -1864,8 +1877,8 @@ static const struct attribute_group at91_adc_attribute_group = { };static const struct attribute *at91_adc_fifo_attributes[] = { - &iio_const_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_const_attr_hwfifo_watermark_max.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, + &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, &iio_dev_attr_hwfifo_watermark.dev_attr.attr, &iio_dev_attr_hwfifo_enabled.dev_attr.attr,NULL ,
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Re: [PATCH v3 04/10] iio: at91-sama5d2_adc: Fix unsafe buffer attributes
Quoted 10 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()was changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Quoted 5 lines
Change the
IIO_CONST_ATTRsfrom the driver toIIO_DEVICE_ATTRin order to prevent the invalid memory access.Signed-off-by Matti Vaittinen <[email protected]>Fixes 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr")
on SAMA5D2
Re: [PATCH v3 04/10] iio: at91-sama5d2_adc: Fix unsafe buffer attributes
Quoted 14 lines · On Thu, 6 Oct 2022 08:34:17 +0000 <[email protected]> wrote:
Quoted 13 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()was changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().The added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Change the
IIO_CONST_ATTRsfrom the driver toIIO_DEVICE_ATTRin order to prevent the invalid memory access.
Quoted 7 lines
Quoted 2 lines
Signed-off-by Matti Vaittinen <[email protected]>Fixes 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr")Tested-by Claudiu Beznea <[email protected]>on SAMA5D2
Applied to the fixes-togreg branch of iio.git and marked for stable.
For the reset of the series I'll need to wait for these first 4 patches to make their way to upstream of the togreg branch then queue the rest up on top of that.
Jonathan
Quoted 1 line
PATCH v3 5/10 iio: Add IIO_STATIC_CONST_DEVICE_ATTR
In reply to Matti VaittinenAdd IIO_STATIC_CONST_DEVICE_ATTR macro for creating an read-only iio_dev_attr which returns constant value. This macro is intended to be used when replacing the IIO_CONST_ATTR - attributes for triggered buffers because the triggered buffer attributes must be of type iio_dev_attr.
--- include/linux/iio/sysfs.h | 11 +++++++++++ 1 file changed, 11 insertions(+)
include/linux/iio/sysfs.h +11 -0
@@ -97,6 +97,17 @@ struct iio_const_attr { = { .string = _string, \ .dev_attr = __ATTR(_name, S_IRUGO, iio_read_const_attr, NULL)} +#define IIO_STATIC_CONST_DEVICE_ATTR (_name, _string) \ + static ssize_t iio_const_dev_attr_show_##_name( \ + struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ + { \ + return sysfs_emit(buf, "%s\n", _string); \ + } \ + static IIO_DEVICE_ATTR(_name, 0444, \ + iio_const_dev_attr_show_##_name, NULL, 0) +/* Generic attributes of onetype or another */ /**
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
PATCH v3 6/10 iio: adxl367: Use IIO_STATIC_CONST_DEVICE_ATTR()
In reply to Matti VaittinenSlightly simplify by dropping open-coded constant data iio_dev_attr functions and using the IIO_STATIC_CONST_DEVICE_ATTR() instead.
--- drivers/iio/accel/adxl367.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-)
drivers/iio/accel/adxl367.c +3 -16
@@ -1185,22 +1185,9 @@ static ssize_t adxl367_get_fifo_watermark(struct device *dev,return sysfs_emit (buf,"%d\n" , fifo_watermark); } -static ssize_t hwfifo_watermark_min_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,"1" ); -} - -static ssize_t hwfifo_watermark_max_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,__stringify (ADXL367_FIFO_MAX_WATERMARK )); -} - -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_min,"1" ); +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_max, +__stringify (ADXL367_FIFO_MAX_WATERMARK )); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, adxl367_get_fifo_watermark, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
PATCH v3 7/10 iio: adxl372: Use IIO_STATIC_CONST_DEVICE_ATTR()
In reply to Matti VaittinenSlightly simplify by dropping open-coded constant data iio_dev_attr functions and using the IIO_STATIC_CONST_DEVICE_ATTR() instead.
--- drivers/iio/accel/adxl372.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-)
drivers/iio/accel/adxl372.c +3 -16
@@ -998,22 +998,9 @@ static ssize_t adxl372_get_fifo_watermark(struct device *dev,return sprintf (buf,"%d\n" , st->watermark); } -static ssize_t hwfifo_watermark_min_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,"1" ); -} - -static ssize_t hwfifo_watermark_max_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,__stringify (ADXL372_FIFO_SIZE )); -} - -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_min,"1" ); +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_max, +__stringify (ADXL372_FIFO_SIZE )); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, adxl372_get_fifo_watermark, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
PATCH v3 8/10 iio: bmc150-accel-core: Use IIO_STATIC_CONST_DEVICE_ATTR()
In reply to Matti VaittinenSlightly simplify by dropping open-coded constant data iio_dev_attr functions and using the IIO_STATIC_CONST_DEVICE_ATTR() instead.
--- drivers/iio/accel/bmc150-accel-core.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-)
drivers/iio/accel/bmc150-accel-core.c +3 -16
@@ -925,22 +925,9 @@ static const struct iio_chan_spec_ext_info bmc150_accel_ext_info[] = { { } }; -static ssize_t hwfifo_watermark_min_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,"1" ); -} - -static ssize_t hwfifo_watermark_max_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,__stringify (BMC150_ACCEL_FIFO_LENGTH )); -} - -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_min,"1" ); +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_max, +__stringify (BMC150_ACCEL_FIFO_LENGTH )); static IIO_DEVICE_ATTR(hwfifo_enabled, S_IRUGO, bmc150_accel_get_fifo_state, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, S_IRUGO,
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
PATCH v3 9/10 iio: at91-sama5d2_adc: Use IIO_STATIC_CONST_DEVICE_ATTR()
In reply to Matti VaittinenSlightly simplify by dropping open-coded constant data iio_dev_attr functions and using the IIO_STATIC_CONST_DEVICE_ATTR() instead.
--- drivers/iio/adc/at91-sama5d2_adc.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-)
drivers/iio/adc/at91-sama5d2_adc.c +3 -16
@@ -1841,26 +1841,13 @@ static ssize_t at91_adc_get_watermark(struct device *dev,return scnprintf (buf,PAGE_SIZE ,"%d\n" , st->dma_st.watermark); } -static ssize_t hwfifo_watermark_min_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,"2" ); -} - -static ssize_t hwfifo_watermark_max_show (struct device *dev, -struct device_attribute *attr, -char *buf) -{ -return sysfs_emit (buf,"%s\n" ,AT91_HWFIFO_MAX_SIZE_STR ); -} - static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, at91_adc_get_fifo_state, NULL, 0); static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, at91_adc_get_watermark, NULL, 0); -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0); -static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); + +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_min,"2" ); +IIO_STATIC_CONST_DEVICE_ATTR (hwfifo_watermark_max,AT91_HWFIFO_MAX_SIZE_STR ); static IIO_CONST_ATTR(oversampling_ratio_available, __stringify(AT91_OSR_1SAMPLES) " "
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Re: [PATCH v3 09/10] iio: at91-sama5d2_adc: Use IIO_STATIC_CONST_DEVICE_ATTR()
Quoted 4 lines · Matti Vaittinen
Slightly simplify by dropping open-coded constant data
iio_dev_attrfunctions and using theIIO_STATIC_CONST_DEVICE_ATTR()instead.Signed-off-by Matti Vaittinen <[email protected]>
on SAMA5D2
PATCH v3 10/10 iio: Don't silently expect attribute types
In reply to Matti VaittinenThe iio_triggered_buffer_setup_ext() and the devm_iio_kfifo_buffer_setup_ext() were changed by
commit 15097c7a1adc ("iio: buffer: wrap all buffer attributes into iio_dev_attr") to silently expect that all attributes given in buffer_attrs array are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created by IIO_CONST_ATTR().
When using IIO_CONST_ATTRs the added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Change the function signatures to expect an array of iio_dev_attrs to avoid similar errors in the future.
---
v2 => v3:
split the driver fixes to separate patches for easier back port and adjust the commit message accordinly.
v1 => v2:
fix also industrialio-buffer-dmaengine.c and cros_ec_sensors_core.c
The fix is only superficially tested by a ROHM/kionix KX022A driver. Proper testing with real in-tree IIO stuff is _highly_ appreciated.
--- drivers/iio/accel/adxl367.c | 10 +++++----- drivers/iio/accel/adxl372.c | 10 +++++----- drivers/iio/accel/bmc150-accel-core.c | 12 ++++++------ drivers/iio/adc/at91-sama5d2_adc.c | 12 ++++++------ drivers/iio/buffer/industrialio-buffer-dmaengine.c | 4 ++-- drivers/iio/buffer/industrialio-triggered-buffer.c | 4 ++-- drivers/iio/buffer/kfifo_buf.c | 2 +- .../common/cros_ec_sensors/cros_ec_sensors_core.c | 6 +++--- drivers/iio/common/hid-sensors/hid-sensor-trigger.c | 8 ++++---- drivers/iio/industrialio-buffer.c | 11 +++++++---- include/linux/iio/buffer_impl.h | 2 +- include/linux/iio/kfifo_buf.h | 3 ++- include/linux/iio/triggered_buffer.h | 6 +++--- 13 files changed, 47 insertions(+), 43 deletions(-)
drivers/iio/accel/adxl367.c +5 -5
@@ -1193,11 +1193,11 @@ static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, adxl367_get_fifo_enabled, NULL, 0); -static const struct attribute *adxl367_fifo_attributes[] = { - &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark.dev_attr.attr, - &iio_dev_attr_hwfifo_enabled.dev_attr.attr, +static const struct iio_dev_attr *adxl367_fifo_attributes[] = { + &iio_dev_attr_hwfifo_watermark_min, + &iio_dev_attr_hwfifo_watermark_max, + &iio_dev_attr_hwfifo_watermark, + &iio_dev_attr_hwfifo_enabled,NULL , };
drivers/iio/accel/adxl372.c +5 -5
@@ -1006,11 +1006,11 @@ static IIO_DEVICE_ATTR(hwfifo_watermark, 0444, static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, adxl372_get_fifo_enabled, NULL, 0); -static const struct attribute *adxl372_fifo_attributes[] = { - &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark.dev_attr.attr, - &iio_dev_attr_hwfifo_enabled.dev_attr.attr, +static const struct iio_dev_attr *adxl372_fifo_attributes[] = { + &iio_dev_attr_hwfifo_watermark_min, + &iio_dev_attr_hwfifo_watermark_max, + &iio_dev_attr_hwfifo_watermark, + &iio_dev_attr_hwfifo_enabled,NULL , };
drivers/iio/accel/bmc150-accel-core.c +6 -6
@@ -933,11 +933,11 @@ static IIO_DEVICE_ATTR(hwfifo_enabled, S_IRUGO, static IIO_DEVICE_ATTR(hwfifo_watermark, S_IRUGO, bmc150_accel_get_fifo_watermark, NULL, 0); -static const struct attribute *bmc150_accel_fifo_attributes[] = { - &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark.dev_attr.attr, - &iio_dev_attr_hwfifo_enabled.dev_attr.attr, +static const struct iio_dev_attr *bmc150_accel_fifo_attributes[] = { + &iio_dev_attr_hwfifo_watermark_min, + &iio_dev_attr_hwfifo_watermark_max, + &iio_dev_attr_hwfifo_watermark, + &iio_dev_attr_hwfifo_enabled,NULL , };
@@ -1665,7 +1665,7 @@ int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq, enum bmc150_type type, const char *name, bool block_supported) { - const struct attribute **fifo_attrs; + const struct iio_dev_attr **fifo_attrs;struct bmc150_accel_data *data;struct iio_dev *indio_dev;int ret;
drivers/iio/adc/at91-sama5d2_adc.c +6 -6
@@ -1863,11 +1863,11 @@ static const struct attribute_group at91_adc_attribute_group = { .attrs = at91_adc_attributes, }; -static const struct attribute *at91_adc_fifo_attributes[] = { - &iio_dev_attr_hwfifo_watermark_min.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark.dev_attr.attr, - &iio_dev_attr_hwfifo_enabled.dev_attr.attr, +static const struct iio_dev_attr *at91_adc_fifo_attributes[] = { + &iio_dev_attr_hwfifo_watermark_min, + &iio_dev_attr_hwfifo_watermark_max, + &iio_dev_attr_hwfifo_watermark, + &iio_dev_attr_hwfifo_enabled,NULL , };
@@ -1884,7 +1884,7 @@ static int at91_adc_buffer_and_trigger_init(struct device *dev, struct iio_dev *indio) {struct at91_adc_state *st =iio_priv (indio); -const struct attribute **fifo_attrs; +const struct iio_dev_attr **fifo_attrs;int ret;if (st->selected_trig->hw_trig)
drivers/iio/buffer/industrialio-buffer-dmaengine.c +2 -2
@@ -142,8 +142,8 @@ static ssize_t iio_dmaengine_buffer_get_length_align(struct device *dev, static IIO_DEVICE_ATTR(length_align_bytes, 0444, iio_dmaengine_buffer_get_length_align, NULL, 0); -static const struct attribute *iio_dmaengine_buffer_attrs[] = { - &iio_dev_attr_length_align_bytes.dev_attr.attr, +static const struct iio_dev_attr *iio_dmaengine_buffer_attrs[] = { + &iio_dev_attr_length_align_bytes,NULL , };
drivers/iio/buffer/industrialio-triggered-buffer.c +2 -2
@@ -41,7 +41,7 @@ int iio_triggered_buffer_setup_ext(struct iio_dev *indio_dev,irqreturn_t (*thread)(int irq,void *p), enum iio_buffer_direction direction, const struct iio_buffer_setup_ops *setup_ops, - const struct attribute **buffer_attrs) + const struct iio_dev_attr **buffer_attrs) { struct iio_buffer *buffer;int ret;
@@ -110,7 +110,7 @@ int devm_iio_triggered_buffer_setup_ext(struct device *dev,irqreturn_t (*thread)(int irq,void *p), enum iio_buffer_direction direction, const struct iio_buffer_setup_ops *ops, - const struct attribute **buffer_attrs) + const struct iio_dev_attr **buffer_attrs) { int ret;
drivers/iio/buffer/kfifo_buf.c +1 -1
@@ -270,7 +270,7 @@ static struct iio_buffer *devm_iio_kfifo_allocate(struct device *dev)int devm_iio_kfifo_buffer_setup_ext (struct device *dev,struct iio_dev *indio_dev,const struct iio_buffer_setup_ops *setup_ops, -const struct attribute **buffer_attrs) +const struct iio_dev_attr **buffer_attrs) {struct iio_buffer *buffer;
drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c +3 -3
@@ -172,9 +172,9 @@ static ssize_t hwfifo_watermark_max_show(struct device *dev, static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0); -static const struct attribute *cros_ec_sensor_fifo_attributes[] = { - &iio_dev_attr_hwfifo_timeout.dev_attr.attr, - &iio_dev_attr_hwfifo_watermark_max.dev_attr.attr, +static const struct iio_dev_attr *cros_ec_sensor_fifo_attributes[] = { + &iio_dev_attr_hwfifo_timeout, + &iio_dev_attr_hwfifo_watermark_max,NULL , };
drivers/iio/common/hid-sensors/hid-sensor-trigger.c +4 -4
@@ -75,9 +75,9 @@ static IIO_DEVICE_ATTR(hwfifo_timeout, 0644, static IIO_DEVICE_ATTR(hwfifo_enabled, 0444, _hid_sensor_get_fifo_state, NULL, 0); -static const struct attribute *hid_sensor_fifo_attributes[] = { - &iio_dev_attr_hwfifo_timeout.dev_attr.attr, - &iio_dev_attr_hwfifo_enabled.dev_attr.attr, +static const struct iio_dev_attr *hid_sensor_fifo_attributes[] = { + &iio_dev_attr_hwfifo_timeout, + &iio_dev_attr_hwfifo_enabled,NULL , };
@@ -231,7 +231,7 @@ static const struct iio_trigger_ops hid_sensor_trigger_ops = {int hid_sensor_setup_trigger (struct iio_dev *indio_dev,const char *name,struct hid_sensor_common *attrb) { -const struct attribute **fifo_attrs; +const struct iio_dev_attr **fifo_attrs;int ret;struct iio_trigger *trig;
drivers/iio/industrialio-buffer.c +7 -4
@@ -1599,6 +1599,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, {struct iio_dev_opaque *iio_dev_opaque =to_iio_dev_opaque (indio_dev);struct iio_dev_attr *p; +const struct iio_dev_attr *id_attr;struct attribute **attr;int ret, i, attrn, scan_el_attrcount, buffer_attrcount;const struct iio_chan_spec *channels;
@@ -1608,6 +1609,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer,while (buffer->attrs[buffer_attrcount] !=NULL ) buffer_attrcount++; } + buffer_attrcount +=ARRAY_SIZE (iio_buffer_attrs); scan_el_attrcount =0 ;INIT_LIST_HEAD (&buffer->buffer_attr_list);
@@ -1650,7 +1652,7 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, } } - attrn = buffer_attrcount + scan_el_attrcount +ARRAY_SIZE (iio_buffer_attrs); + attrn = buffer_attrcount + scan_el_attrcount; attr =kcalloc (attrn +1 ,sizeof (*attr),GFP_KERNEL );if (!attr) { ret = -ENOMEM ;
@@ -1665,10 +1667,11 @@ static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, attr[2 ] = &dev_attr_watermark_ro.attr;if (buffer->attrs) -memcpy (&attr[ARRAY_SIZE (iio_buffer_attrs)], buffer->attrs, -sizeof (struct attribute *) * buffer_attrcount); +for (i =0 , id_attr = buffer->attrs[i]; + (id_attr = buffer->attrs[i]); i++) + attr[ARRAY_SIZE (iio_buffer_attrs) + i] = + (struct attribute *)&id_attr->dev_attr.attr; - buffer_attrcount +=ARRAY_SIZE (iio_buffer_attrs); buffer->buffer_group.attrs = attr;for (i =0 ; i < buffer_attrcount; i++) {
include/linux/iio/buffer_impl.h +1 -1
@@ -123,7 +123,7 @@ struct iio_buffer {struct attribute_group buffer_group;/* @attrs: Standard attributes of the buffer. */ -const struct attribute **attrs; +const struct iio_dev_attr **attrs;/* @demux_bounce: Buffer for doing gather from incoming scan. */ void *demux_bounce;
include/linux/iio/kfifo_buf.h +2 -1
@@ -5,6 +5,7 @@struct iio_buffer ;struct iio_buffer_setup_ops ;struct iio_dev ; +struct iio_dev_attr ;struct device ;struct iio_buffer *iio_kfifo_allocate (void );
@@ -13,7 +14,7 @@ void iio_kfifo_free(struct iio_buffer *r);int devm_iio_kfifo_buffer_setup_ext (struct device *dev,struct iio_dev *indio_dev,const struct iio_buffer_setup_ops *setup_ops, -const struct attribute **buffer_attrs); +const struct iio_dev_attr **buffer_attrs);#define devm_iio_kfifo_buffer_setup (dev, indio_dev, setup_ops) \ devm_iio_kfifo_buffer_setup_ext((dev), (indio_dev), (setup_ops), NULL)
include/linux/iio/triggered_buffer.h +3 -3
@@ -5,8 +5,8 @@#include <linux/iio/buffer.h> #include <linux/interrupt.h> -struct attribute ;struct iio_dev ; +struct iio_dev_attr ;struct iio_buffer_setup_ops ; int iio_triggered_buffer_setup_ext(struct iio_dev *indio_dev,
@@ -14,7 +14,7 @@ int iio_triggered_buffer_setup_ext(struct iio_dev *indio_dev,irqreturn_t (*thread)(int irq,void *p), enum iio_buffer_direction direction, const struct iio_buffer_setup_ops *setup_ops, - const struct attribute **buffer_attrs); + const struct iio_dev_attr **buffer_attrs);void iio_triggered_buffer_cleanup (struct iio_dev *indio_dev);#define iio_triggered_buffer_setup (indio_dev, h, thread, setup_ops) \
@@ -28,7 +28,7 @@ int devm_iio_triggered_buffer_setup_ext(struct device *dev,irqreturn_t (*thread)(int irq,void *p), enum iio_buffer_direction direction, const struct iio_buffer_setup_ops *ops, - const struct attribute **buffer_attrs); + const struct iio_dev_attr **buffer_attrs);#define devm_iio_triggered_buffer_setup (dev, indio_dev, h, thread, setup_ops) \ devm_iio_triggered_buffer_setup_ext((dev), (indio_dev), (h), (thread), \
Signature · 14 lines
2.37.3 -- Matti Vaittinen, Linux device drivers ROHM Semiconductors, Finland SWDC Kiviharjunlenkki 1E 90220 OULU FINLAND ~~~ "I don't think so," said Rene Descartes. Just then he vanished ~~~ Simon says - in Latin please. ~~~ "non cogito me" dixit Rene Descarte, deinde evanescavit ~~~ Thanks to Simon Glass for the translation =]
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Quoted 7 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().
Quoted 6 lines
When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future.
...
Wouldn't be better to split this on per driver basis or is it impossible?
Quoted 13 lines
drivers/iio/accel/adxl367.c | 10 +++++----- drivers/iio/accel/adxl372.c | 10 +++++----- drivers/iio/accel/bmc150-accel-core.c | 12 ++++++------ drivers/iio/adc/at91-sama5d2_adc.c | 12 ++++++------ drivers/iio/buffer/industrialio-buffer-dmaengine.c | 4 ++-- drivers/iio/buffer/industrialio-triggered-buffer.c | 4 ++-- drivers/iio/buffer/kfifo_buf.c | 2 +- .../common/cros_ec_sensors/cros_ec_sensors_core.c | 6 +++--- drivers/iio/common/hid-sensors/hid-sensor-trigger.c | 8 ++++---- drivers/iio/industrialio-buffer.c | 11 +++++++---- include/linux/iio/buffer_impl.h | 2 +- include/linux/iio/kfifo_buf.h | 3 ++- include/linux/iio/triggered_buffer.h | 6 +++---
...
drivers/iio/industrialio-buffer.c static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, · line 1602
Quoted 4 lines
drivers/iio/industrialio-buffer.c +1
-0struct iio_dev_opaque *iio_dev_opaque =to_iio_dev_opaque (indio_dev);struct iio_dev_attr *p; +const struct iio_dev_attr *id_attr;
I'm wondering if we may keep this upper, so "longer line goes first" rule would be satisfied.
Quoted 3 lines
drivers/iio/industrialio-buffer.c +0
-0struct attribute **attr;int ret, i, attrn, scan_el_attrcount, buffer_attrcount;const struct iio_chan_spec *channels;
...
drivers/iio/industrialio-buffer.c static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, · line 1671
Quoted 2 lines
drivers/iio/industrialio-buffer.c +2
-0+for (i =0 , id_attr = buffer->attrs[i]; + (id_attr = buffer->attrs[i]); i++)
Not sure why we have additional parentheses...
drivers/iio/industrialio-buffer.c static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, · line 1673
Quoted 2 lines
drivers/iio/industrialio-buffer.c +2
-0+ attr[ARRAY_SIZE (iio_buffer_attrs) + i] = + (struct attribute *)&id_attr->dev_attr.attr;
...and explicit casting here. Isn't attr is already of a struct attribute?
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Hi Andy,
Thanks for taking the time to review :) Much appreciated.
Quoted 12 lines · Andy Shevchenko
Quoted 11 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Quoted 7 lines
Quoted 2 lines
Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future....
Wouldn't be better to split this on per driver basis or is it impossible?
We need to change the callers and function signatures in one patch so we don't break bisecting.
Quoted 8 lines
drivers/iio/industrialio-buffer.c static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, · line 1602
Quoted 5 lines
struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev); struct iio_dev_attr *p;drivers/iio/industrialio-buffer.c +1
-0+const struct iio_dev_attr *id_attr;I'm wondering if we may keep this upper, so "longer line goes first" rule would be satisfied.
Sure.
Quoted 11 lines
Quoted 4 lines
struct attribute **attr;
int ret, i, attrn,scan_el_attrcount,buffer_attrcount; const structiio_chan_spec*channels;...
drivers/iio/industrialio-buffer.c static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, · line 1671
Quoted 2 lines
drivers/iio/industrialio-buffer.c +2
-0+for (i =0 , id_attr = buffer->attrs[i]; + (id_attr = buffer->attrs[i]); i++)Not sure why we have additional parentheses...
Because gcc warns about the assignment and suggests adding parenthesis if we don't.
Quoted 4 lines
drivers/iio/industrialio-buffer.c static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, · line 1673
Quoted 2 lines
drivers/iio/industrialio-buffer.c +2
-0+ attr[ARRAY_SIZE (iio_buffer_attrs) + i] = + (struct attribute *)&id_attr->dev_attr.attr;...and explicit casting here. Isn't attr is already of a struct attribute?
I am glad you asked :)
This is one of the "things" I was not really happy about. Here we hide the fact that our array is full of pointers to _const_ data. If we don't cast the compiler points this out. Old code did the same thing but it did this by just doing a memcpy for the pointers - which I personally consider even worse as it gets really easy to miss this. The cast at least hints there is something slightly "fishy" going on.
My "gut feeling" about the correct fix is we should check if some attributes in the array (stored to the struct here) actually need to be modified later (which I doubt). If I was keen on betting I'd bet we could switch the struct definition to also contain pointers to const attributes. I am afraid this would mean quite a few more changes to the function signatures (changing struct attribute * to const struct attribute *) here and there - and possibly also require some changes to drivers. Thus I didn't even look at that option in the scope of this fix. It should probably be a separate refactoring series. But yes - this cast should catch attention as it did.
Yours,
-- Matti Vaittinen
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Quoted 25 lines · Matti Vaittinen
Hi Andy,
Thanks for taking the time to review :) Much appreciated.
Quoted 20 lines · Andy Shevchenko
Quoted 13 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future....
Quoted 2 lines
+ attr[ARRAY_SIZE(iio_buffer_attrs) + i] = + (struct attribute *)&id_attr->dev_attr.attr;
Quoted 7 lines
Quoted 1 line
...and explicit casting here. Isn't attr is already of a struct attribute?
I am glad you asked :)
This is one of the "things" I was not really happy about. Here we hide the fact that our array is full of pointers to _const_ data. If we don't cast the compiler points this out. Old code did the same thing but it did this by just doing a memcpy for the pointers - which I personally consider even worse as it gets really easy to miss this. The cast at least hints there is something slightly "fishy" going on.My "gut feeling" about the correct fix is we should check if some attributes in the array (stored to the struct here) actually need to be modified later (which I doubt). If I was keen on betting I'd bet we could switch the struct definition to also contain pointers to const attributes. I am afraid this would mean quite a few more changes to the function signatures (changing struct attribute * to const struct attribute *) here and there - and possibly also require some changes to drivers. Thus I didn't even look at that option in the scope of this fix. It should probably be a separate refactoring series. But yes - this cast should catch attention as it did.
Actually, now that you pointed it out - do you think this would warrant a FIXME comment?
Quoted 3 lines
Yours,
-- Matti Vaittinen
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Quoted 3 lines · Matti Vaittinen
Quoted 2 lines · Matti Vaittinen
Quoted 1 line · Andy Shevchenko
On Mon, Oct 03, 2022 at 11:13:53AM +0300, Matti Vaittinen wrote:
...
Quoted 26 lines
Quoted 14 lines
Quoted 5 lines
Quoted 2 lines
+ attr[ARRAY_SIZE(iio_buffer_attrs) + i] = + (struct attribute *)&id_attr->dev_attr.attr;
...and explicit casting here. Isn't attr is already of a struct attribute?
I am glad you asked :)
This is one of the "things" I was not really happy about. Here we hide the fact that our array is full of pointers to _const_ data. If we don't cast the compiler points this out. Old code did the same thing but it did this by just doing a memcpy for the pointers - which I personally consider even worse as it gets really easy to miss this. The cast at least hints there is something slightly "fishy" going on.Quoted 11 lines
My "gut feeling" about the correct fix is we should check if some attributes in the array (stored to the struct here) actually need to be modified later (which I doubt). If I was keen on betting I'd bet we could switch the struct definition to also contain pointers to const attributes. I am afraid this would mean quite a few more changes to the function signatures (changing struct attribute * to const struct attribute *) here and there - and possibly also require some changes to drivers. Thus I didn't even look at that option in the scope of this fix. It should probably be a separate refactoring series. But yes - this cast should catch attention as it did.
Quoted 2 lines
Actually, now that you pointed it out - do you think this would warrant a FIXME comment?
Makes sense to me, but I'm not a maintainer of IIO :-)
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
In reply to Matti VaittinenQuoted 2 lines · Matti Vaittinen
Quoted 1 line · Andy Shevchenko
On Mon, Oct 03, 2022 at 11:13:53AM +0300, Matti Vaittinen wrote:
...
Quoted 7 lines
Quoted 4 lines
drivers/iio/industrialio-buffer.c static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, · line 1671
Quoted 2 lines
drivers/iio/industrialio-buffer.c +2
-0+for (i =0 , id_attr = buffer->attrs[i]; + (id_attr = buffer->attrs[i]); i++)Not sure why we have additional parentheses...
Because gcc warns about the assignment and suggests adding parenthesis if we don't.
Ah, this is a condition, so that's why compiler wants to have a _result_ of the assignment and not the ambiguous thingy.
Btw, have you considered to switch to in-loop iterator definitions as we do in many other places? Also, it might make sense to introduce for_each_... type of macro helper if the loop is used more than once.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
In reply to Matti VaittinenQuoted 7 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().
Quoted 8 lines
When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future.Signed-off-by Matti Vaittinen <[email protected]>
on SAMA5D2
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Hi Claudiu,
Quoted 12 lines · On 10/6/22 11:35, [email protected] wrote:
Quoted 11 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.
Quoted 9 lines
Quoted 4 lines
Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future.Signed-off-by Matti Vaittinen <[email protected]>Tested-by Claudiu Beznea <[email protected]>on SAMA5D2
Thanks a ton for the testing! I do _really_ appreciate it :) I am now slightly more confident regarding the fix here - and a lot more confident that we do have an actual bug (as you explained in the reply to the first RFT) :)
Yours
-- Matti
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Jonathan Cameron
maintainerRe: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Quoted 22 lines · On Thu, 6 Oct 2022 15:53:52 +0300 Matti Vaittinen <[email protected]>…
Hi Claudiu,
Quoted 19 lines · On 10/6/22 11:35, [email protected] wrote:
Quoted 7 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().Quoted 8 lines
When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future.Signed-off-by Matti Vaittinen <[email protected]>Tested-by Claudiu Beznea <[email protected]>
Quoted 7 lines
Quoted 2 lines
on SAMA5D2
Thanks a ton for the testing! I do _really_ appreciate it :) I am now slightly more confident regarding the fix here - and a lot more confident that we do have an actual bug (as you explained in the reply to the first RFT) :)
You analysis was sound, so I've long been convinced ;)
Anyhow, one more coming through...
AD4130 v9 patch had same issue and so will also need updating with this patch if it lands before yours.
Other than that static macro being ugly (which I can't improve on!) all looks good to me, but I'll let it sit a while longer. If nothing else I want to rebase the fixes-togreg tree on rc1 before putting the first part of this series on top of it then letting them soak in next for a few days,
Thanks,
Jonathan
Quoted 4 lines
Yours
-- Matti
Re: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Quoted 39 lines · Jonathan Cameron
Quoted 22 lines · On Thu, 6 Oct 2022 15:53:52 +0300 Matti Vaittinen <[email protected]>…
Hi Claudiu,
Quoted 19 lines · On 10/6/22 11:35, [email protected] wrote:
Quoted 7 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().Quoted 8 lines
When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future.Signed-off-by Matti Vaittinen <[email protected]>Tested-by Claudiu Beznea <[email protected]>Quoted 7 lines
Quoted 2 lines
on SAMA5D2
Thanks a ton for the testing! I do _really_ appreciate it :) I am now slightly more confident regarding the fix here - and a lot more confident that we do have an actual bug (as you explained in the reply to the first RFT) :)
You analysis was sound, so I've long been convinced ;)
Anyhow, one more coming through...
AD4130 v9 patch had same issue and so will also need updating with this patch if it lands before yours.
Quoted 5 lines
Other than that static macro being ugly (which I can't improve on!) all looks good to me, but I'll let it sit a while longer. If nothing else I want to rebase the fixes-togreg tree on rc1 before putting the first part of this series on top of it then letting them soak in next for a few days,
Thanks Jonathan.
Can you please ping me if you want me to rebase/rework the series? (I may combine this with the kx022a-series then, but naturally not all patches in the series need to be applied at once. Eg, fixes can be taken in faster, kx022a part can be iterated, iterated, iterated... ;] ).
Yours
-- Matti
Signature · 5 lines
Matti Vaittinen Linux kernel developer at ROHM Semiconductors Oulu Finland ~~ When things go utterly wrong vim users can always type :help! ~~
Jonathan Cameron
maintainerRe: [RFT PATCH v3 10/10] iio: Don't silently expect attribute types
Quoted 46 lines · On Mon, 10 Oct 2022 12:36:54 +0300 Matti Vaittinen <[email protected]>…
Quoted 39 lines · Jonathan Cameron
Quoted 22 lines · On Thu, 6 Oct 2022 15:53:52 +0300 Matti Vaittinen <[email protected]>…
Hi Claudiu,
Quoted 19 lines · On 10/6/22 11:35, [email protected] wrote:
Quoted 7 lines · Matti Vaittinen
The
iio_triggered_buffer_setup_ext()and thedevm_iio_kfifo_buffer_setup_ext()were changed by
commit15097c7a1adc("iio: buffer: wrap all buffer attributes intoiio_dev_attr") to silently expect that all attributes given inbuffer_attrsarray are device-attributes. This expectation was not forced by the API - and some drivers did register attributes created byIIO_CONST_ATTR().Quoted 8 lines
When using
IIO_CONST_ATTRsthe added attribute "wrapping" does not copy the pointer to stored string constant and when the sysfs file is read the kernel will access to invalid location.Change the function signatures to expect an array of
iio_dev_attrsto avoid similar errors in the future.Signed-off-by Matti Vaittinen <[email protected]>Tested-by Claudiu Beznea <[email protected]>Quoted 7 lines
Quoted 2 lines
on SAMA5D2
Thanks a ton for the testing! I do _really_ appreciate it :) I am now slightly more confident regarding the fix here - and a lot more confident that we do have an actual bug (as you explained in the reply to the first RFT) :)
You analysis was sound, so I've long been convinced ;)
Anyhow, one more coming through...
AD4130 v9 patch had same issue and so will also need updating with this patch if it lands before yours.Quoted 5 lines
Other than that static macro being ugly (which I can't improve on!) all looks good to me, but I'll let it sit a while longer. If nothing else I want to rebase the fixes-togreg tree on rc1 before putting the first part of this series on top of it then letting them soak in next for a few days,
Quoted 6 lines
Thanks Jonathan.
Can you please ping me if you want me to rebase/rework the series? (I may combine this with the kx022a-series then, but naturally not all patches in the series need to be applied at once. Eg, fixes can be taken in faster, kx022a part can be iterated, iterated, iterated... ;] ).
Applied the remainder of this series. As expected need to make the changes in patch 10 to your kx022a driver and the ad4130 ADC that also crossed with this series.
+CC Cosmin for the ad4130. Please check the result in the testing branch of iio.git.
Applied to the togreg branch of iio.git and pushed out initially as testing.
This is a nice hardening of the code against future mistakes.
Thanks,
Jonathan
Quoted 4 lines
Yours
-- Matti