2024-04-30 12:44:42

by Matti Vaittinen

[permalink] [raw]
Subject: [PATCH v2 0/2] Fix the iio-gts-helpers available times table sorting

Fix the available times table sorting in iio-gts-helpers

This series contains a fix and test for the sorting of the available times in
IIO-gts helpers. Fix was originally developed and posted by Chenyuan Yang.

Revision history:
v1 => v2:
- Fix the sender for patch 1/2 (Sic!)
- Fix Co-Developed-by tag (drop this from Chenyuan who
is the original author)
- Fix the From: tag as instructed in:
https://www.kernel.org/doc/html/latest/process/submitting-patches.html

---

Chenyuan Yang (1):
iio: Fix the sorting functionality in iio_gts_build_avail_time_table

Matti Vaittinen (1):
iio: test: gts: test available times and gains sorting


Chenyuan Yang (1):
iio: Fix the sorting functionality in iio_gts_build_avail_time_table

Matti Vaittinen (1):
iio: test: gts: test available times and gains sorting

drivers/iio/industrialio-gts-helper.c | 7 +++++--
drivers/iio/test/iio-test-gts.c | 8 +++++---
2 files changed, 10 insertions(+), 5 deletions(-)


base-commit: 4cece764965020c22cff7665b18a012006359095
--
2.44.0


--
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 =]


Attachments:
(No filename) (1.40 kB)
signature.asc (499.00 B)
Download all attachments

2024-04-30 12:45:10

by Matti Vaittinen

[permalink] [raw]
Subject: [PATCH v2 1/2] iio: Fix the sorting functionality in iio_gts_build_avail_time_table

From: Chenyuan Yang <[email protected]>

The sorting in iio_gts_build_avail_time_table is not working as intended.
It could result in an out-of-bounds access when the time is zero.

Here are more details:

1. When the gts->itime_table[i].time_us is zero, e.g., the time
sequence is `3, 0, 1`, the inner for-loop will not terminate and do
out-of-bound writes. This is because once `times[j] > new`, the value
`new` will be added in the current position and the `times[j]` will be
moved to `j+1` position, which makes the if-condition always hold.
Meanwhile, idx will be added one, making the loop keep running without
termination and out-of-bound write.
2. If none of the gts->itime_table[i].time_us is zero, the elements
will just be copied without being sorted as described in the comment
"Sort times from all tables to one and remove duplicates".

For more details, please refer to
https://lore.kernel.org/all/[email protected].

Reported-by: Chenyuan Yang <[email protected]>
Suggested-by: Matti Vaittinen <[email protected]>
Fixes: 38416c28e168 ("iio: light: Add gain-time-scale helpers")
Signed-off-by: Chenyuan Yang <[email protected]>
Co-developed-by: Matti Vaittinen <[email protected]>
Signed-off-by: Matti Vaittinen <[email protected]>

---
Revision history:
v1 => v2:
- Fix the sender and From: tag
- Drop the Co-developed-by tag from original author

Original commit (by Chenyuan Yang) was amended by me to remove duplicates
so that the user-space callers do not get multiple instances of same time
as was discussed here:
https://lore.kernel.org/all/[email protected]/
---
drivers/iio/industrialio-gts-helper.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/industrialio-gts-helper.c b/drivers/iio/industrialio-gts-helper.c
index b51eb6cb766f..59d7615c0f56 100644
--- a/drivers/iio/industrialio-gts-helper.c
+++ b/drivers/iio/industrialio-gts-helper.c
@@ -362,17 +362,20 @@ static int iio_gts_build_avail_time_table(struct iio_gts *gts)
for (i = gts->num_itime - 1; i >= 0; i--) {
int new = gts->itime_table[i].time_us;

- if (times[idx] < new) {
+ if (idx == 0 || times[idx - 1] < new) {
times[idx++] = new;
continue;
}

- for (j = 0; j <= idx; j++) {
+ for (j = 0; j < idx; j++) {
+ if (times[j] == new)
+ break;
if (times[j] > new) {
memmove(&times[j + 1], &times[j],
(idx - j) * sizeof(int));
times[j] = new;
idx++;
+ break;
}
}
}
--
2.44.0


--
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 =]


Attachments:
(No filename) (2.90 kB)
signature.asc (499.00 B)
Download all attachments

2024-04-30 12:45:50

by Matti Vaittinen

[permalink] [raw]
Subject: [PATCH v2 2/2] iio: test: gts: test available times and gains sorting

The iio_gts helpers build available times and scales tables based on the
times and gains arrays given from the driver. The driver should be able
to list all valid register values so that conversion from register valu
to correct gain/time works for all supported register values.

It might be more convenient for drivers to list these times and gains in
the order where they're listed in the data-sheet than ascending order.

However, for user who requests the supported scales / times it is more
convenient to get the results in asscending order. Also, listing
duplicated values is not meaning for the user.

Hence the GTS heler should do sorting and deduplication of the scales
and times when it builds the tables listing the available times/scales.
Note, currently duplicated gain values aren't handled by GTS-helpers.

Unsort the gain and time arrays in the test code, and add duplicates to
time array in order to test the sorting and deduplicating works.

Signed-off-by: Matti Vaittinen <[email protected]>
---
Revision history:
- No changes

drivers/iio/test/iio-test-gts.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/test/iio-test-gts.c b/drivers/iio/test/iio-test-gts.c
index cf7ab773ea0b..5f16a7b5e6d4 100644
--- a/drivers/iio/test/iio-test-gts.c
+++ b/drivers/iio/test/iio-test-gts.c
@@ -70,6 +70,7 @@
*/
static struct iio_gts gts;

+/* Keep the gain and time tables unsorted to test the sorting */
static const struct iio_gain_sel_pair gts_test_gains[] = {
GAIN_SCALE_GAIN(1, TEST_GSEL_1),
GAIN_SCALE_GAIN(4, TEST_GSEL_4),
@@ -79,16 +80,17 @@ static const struct iio_gain_sel_pair gts_test_gains[] = {
GAIN_SCALE_GAIN(256, TEST_GSEL_256),
GAIN_SCALE_GAIN(512, TEST_GSEL_512),
GAIN_SCALE_GAIN(1024, TEST_GSEL_1024),
- GAIN_SCALE_GAIN(2048, TEST_GSEL_2048),
GAIN_SCALE_GAIN(4096, TEST_GSEL_4096),
+ GAIN_SCALE_GAIN(2048, TEST_GSEL_2048),
#define HWGAIN_MAX 4096
};

static const struct iio_itime_sel_mul gts_test_itimes[] = {
- GAIN_SCALE_ITIME_US(400 * 1000, TEST_TSEL_400, 8),
- GAIN_SCALE_ITIME_US(200 * 1000, TEST_TSEL_200, 4),
GAIN_SCALE_ITIME_US(100 * 1000, TEST_TSEL_100, 2),
+ GAIN_SCALE_ITIME_US(400 * 1000, TEST_TSEL_400, 8),
+ GAIN_SCALE_ITIME_US(400 * 1000, TEST_TSEL_400, 8),
GAIN_SCALE_ITIME_US(50 * 1000, TEST_TSEL_50, 1),
+ GAIN_SCALE_ITIME_US(200 * 1000, TEST_TSEL_200, 4),
#define TIMEGAIN_MAX 8
};
#define TOTAL_GAIN_MAX (HWGAIN_MAX * TIMEGAIN_MAX)
--
2.44.0


--
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 =]


Attachments:
(No filename) (2.80 kB)
signature.asc (499.00 B)
Download all attachments

2024-05-05 17:50:46

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] Fix the iio-gts-helpers available times table sorting

On Tue, 30 Apr 2024 15:44:26 +0300
Matti Vaittinen <[email protected]> wrote:

> Fix the available times table sorting in iio-gts-helpers
>
> This series contains a fix and test for the sorting of the available times in
> IIO-gts helpers. Fix was originally developed and posted by Chenyuan Yang.
>
> Revision history:
> v1 => v2:
> - Fix the sender for patch 1/2 (Sic!)
> - Fix Co-Developed-by tag (drop this from Chenyuan who
> is the original author)
> - Fix the From: tag as instructed in:
> https://www.kernel.org/doc/html/latest/process/submitting-patches.html

Am I right in thinking this doesn't matter for existing drivers?
As such not high priority for back porting?

I'll assume that and queue it up for 6.11. If someone shouts I can pull the fix
forwards, but then we have the mess of chasing the testing in later.

Applied to the togreg branch of iio.git and pushed out as testing for 0-day
to poke at it.

Thanks,

Jonathan

>
> ---
>
> Chenyuan Yang (1):
> iio: Fix the sorting functionality in iio_gts_build_avail_time_table
>
> Matti Vaittinen (1):
> iio: test: gts: test available times and gains sorting
>
>
> Chenyuan Yang (1):
> iio: Fix the sorting functionality in iio_gts_build_avail_time_table
>
> Matti Vaittinen (1):
> iio: test: gts: test available times and gains sorting
>
> drivers/iio/industrialio-gts-helper.c | 7 +++++--
> drivers/iio/test/iio-test-gts.c | 8 +++++---
> 2 files changed, 10 insertions(+), 5 deletions(-)
>
>
> base-commit: 4cece764965020c22cff7665b18a012006359095


2024-05-06 05:09:47

by Matti Vaittinen

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] Fix the iio-gts-helpers available times table sorting

On 5/5/24 20:50, Jonathan Cameron wrote:
> On Tue, 30 Apr 2024 15:44:26 +0300
> Matti Vaittinen <[email protected]> wrote:
>
>> Fix the available times table sorting in iio-gts-helpers
>>
>> This series contains a fix and test for the sorting of the available times in
>> IIO-gts helpers. Fix was originally developed and posted by Chenyuan Yang.
>>
>> Revision history:
>> v1 => v2:
>> - Fix the sender for patch 1/2 (Sic!)
>> - Fix Co-Developed-by tag (drop this from Chenyuan who
>> is the original author)
>> - Fix the From: tag as instructed in:
>> https://www.kernel.org/doc/html/latest/process/submitting-patches.html
>
> Am I right in thinking this doesn't matter for existing drivers?

I think this is right. Only couple of in-tree drivers are using these
helpers for now, and all of them sorted the tables already in driver.

> As such not high priority for back porting?

The bug is pretty nasty as it causes invalid memory accesses. Hence I'd
like to see this landing in the longterm kernels. It seems to me the GTS
helpers got merged in 6.4, so getting the fix backported to 6.6 might
make sense.

> I'll assume that and queue it up for 6.11. If someone shouts I can pull the fix
> forwards, but then we have the mess of chasing the testing in later.

I am sorry Jonathan but I'm not quite sure what you mean by "pulling fix
forward", or what is the "mess of chasing the testing in later" :)

> Applied to the togreg branch of iio.git and pushed out as testing for 0-day
> to poke at it.

Thanks! Appreciate your work as always!

Yours,
-- Matti

--
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland

~~ When things go utterly wrong vim users can always type :help! ~~


2024-05-06 12:54:30

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] Fix the iio-gts-helpers available times table sorting

On Mon, 6 May 2024 08:09:27 +0300
Matti Vaittinen <[email protected]> wrote:

> On 5/5/24 20:50, Jonathan Cameron wrote:
> > On Tue, 30 Apr 2024 15:44:26 +0300
> > Matti Vaittinen <[email protected]> wrote:
> >
> >> Fix the available times table sorting in iio-gts-helpers
> >>
> >> This series contains a fix and test for the sorting of the available times in
> >> IIO-gts helpers. Fix was originally developed and posted by Chenyuan Yang.
> >>
> >> Revision history:
> >> v1 => v2:
> >> - Fix the sender for patch 1/2 (Sic!)
> >> - Fix Co-Developed-by tag (drop this from Chenyuan who
> >> is the original author)
> >> - Fix the From: tag as instructed in:
> >> https://www.kernel.org/doc/html/latest/process/submitting-patches.html
> >
> > Am I right in thinking this doesn't matter for existing drivers?
>
> I think this is right. Only couple of in-tree drivers are using these
> helpers for now, and all of them sorted the tables already in driver.
>
> > As such not high priority for back porting?
>
> The bug is pretty nasty as it causes invalid memory accesses. Hence I'd
> like to see this landing in the longterm kernels. It seems to me the GTS
> helpers got merged in 6.4, so getting the fix backported to 6.6 might
> make sense.
>
> > I'll assume that and queue it up for 6.11. If someone shouts I can pull the fix
> > forwards, but then we have the mess of chasing the testing in later.
>
> I am sorry Jonathan but I'm not quite sure what you mean by "pulling fix
> forward", or what is the "mess of chasing the testing in later" :)

Hmm. That was an odd choice of words :) I just meant that I could send
the fix in the first set of fixes after 6.10-rc1 rather than waiting for 6.11.

For now I'll leave it queued for 6.11 on the basis there are a lot of ways
a driver writer can cause similar out of bounds accesses and they should
notice it not working during testing. So it 'should' not be a problem to
not rush this in.

J
>
> > Applied to the togreg branch of iio.git and pushed out as testing for 0-day
> > to poke at it.
>
> Thanks! Appreciate your work as always!
>
> Yours,
> -- Matti
>


2024-05-07 06:14:30

by Matti Vaittinen

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] Fix the iio-gts-helpers available times table sorting

On 5/6/24 15:53, Jonathan Cameron wrote:
> On Mon, 6 May 2024 08:09:27 +0300
> Matti Vaittinen <[email protected]> wrote:
>
>> On 5/5/24 20:50, Jonathan Cameron wrote:
>>> On Tue, 30 Apr 2024 15:44:26 +0300
>>> Matti Vaittinen <[email protected]> wrote:
>>>
>>>> Fix the available times table sorting in iio-gts-helpers
>>>>
>>>> This series contains a fix and test for the sorting of the available times in
>>>> IIO-gts helpers. Fix was originally developed and posted by Chenyuan Yang.
>>>>
>>>> Revision history:
>>>> v1 => v2:
>>>> - Fix the sender for patch 1/2 (Sic!)
>>>> - Fix Co-Developed-by tag (drop this from Chenyuan who
>>>> is the original author)
>>>> - Fix the From: tag as instructed in:
>>>> https://www.kernel.org/doc/html/latest/process/submitting-patches.html
>>>
>>> Am I right in thinking this doesn't matter for existing drivers?
>>
>> I think this is right. Only couple of in-tree drivers are using these
>> helpers for now, and all of them sorted the tables already in driver.
>>
>>> As such not high priority for back porting?
>>
>> The bug is pretty nasty as it causes invalid memory accesses. Hence I'd
>> like to see this landing in the longterm kernels. It seems to me the GTS
>> helpers got merged in 6.4, so getting the fix backported to 6.6 might
>> make sense.
>>
>>> I'll assume that and queue it up for 6.11. If someone shouts I can pull the fix
>>> forwards, but then we have the mess of chasing the testing in later.
>>
>> I am sorry Jonathan but I'm not quite sure what you mean by "pulling fix
>> forward", or what is the "mess of chasing the testing in later" :)
>
> Hmm. That was an odd choice of words :) I just meant that I could send
> the fix in the first set of fixes after 6.10-rc1 rather than waiting for 6.11.

Oh, right :)

> For now I'll leave it queued for 6.11 on the basis there are a lot of ways
> a driver writer can cause similar out of bounds accesses and they should
> notice it not working during testing. So it 'should' not be a problem to
> not rush this in.
>

I guess this means the 6.10 won't have the fix? I believe this is fine -
assuming the 6.10 is not going to be an LTS. Thanks for taking care of
this! :)

Yours,
-- Matti


--
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland

~~ When things go utterly wrong vim users can always type :help! ~~


2024-05-10 05:15:04

by Matti Vaittinen

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] Fix the iio-gts-helpers available times table sorting

On 5/9/24 15:15, Jonathan Cameron wrote:
> On Tue, 7 May 2024 09:14:15 +0300
> Matti Vaittinen <[email protected]> wrote:
>> On 5/6/24 15:53, Jonathan Cameron wrote:
>>> On Mon, 6 May 2024 08:09:27 +0300
>>> Matti Vaittinen <[email protected]> wrote:
>>>> On 5/5/24 20:50, Jonathan Cameron wrote:
>>>>> On Tue, 30 Apr 2024 15:44:26 +0300
>>>>> Matti Vaittinen <[email protected]> wrote:
>>>>> >>> For now I'll leave it queued for 6.11 on the basis there are a lot
of ways
>>> a driver writer can cause similar out of bounds accesses and they should
>>> notice it not working during testing. So it 'should' not be a problem to
>>> not rush this in.
>>>
>>
>> I guess this means the 6.10 won't have the fix? I believe this is fine -
>> assuming the 6.10 is not going to be an LTS. Thanks for taking care of
>> this! :)
> It may well get backported anyway, but after 6.11 merge window.

This sounds good. Thanks for clarifying!

Yours,
-- Matti

--
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland

~~ When things go utterly wrong vim users can always type :help! ~~