| From 3170256d7bc1ef81587caf4b83573eb1f5bb4fb6 Mon Sep 17 00:00:00 2001 |
| From: Fabrice Gasnier <fabrice.gasnier@foss.st.com> |
| Date: Tue, 29 Aug 2023 15:40:22 +0200 |
| Subject: counter: chrdev: fix getting array extensions |
| |
| From: Fabrice Gasnier <fabrice.gasnier@foss.st.com> |
| |
| commit 3170256d7bc1ef81587caf4b83573eb1f5bb4fb6 upstream. |
| |
| When trying to watch a component array extension, and the array isn't the |
| first extended element, it fails as the type comparison is always done on |
| the 1st element. Fix it by indexing the 'ext' array. |
| |
| Example on a dummy struct counter_comp: |
| static struct counter_comp dummy[] = { |
| COUNTER_COMP_DIRECTION(..), |
| ..., |
| COUNTER_COMP_ARRAY_CAPTURE(...), |
| }; |
| static struct counter_count dummy_cnt = { |
| ... |
| .ext = dummy, |
| .num_ext = ARRAY_SIZE(dummy), |
| } |
| |
| Currently, counter_get_ext() returns -EINVAL when trying to add a watch |
| event on one of the capture array element in such example. |
| |
| Fixes: d2011be1e22f ("counter: Introduce the COUNTER_COMP_ARRAY component type") |
| Signed-off-by: Fabrice Gasnier <fabrice.gasnier@foss.st.com> |
| Link: https://lore.kernel.org/r/20230829134029.2402868-2-fabrice.gasnier@foss.st.com |
| Signed-off-by: William Breathitt Gray <william.gray@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/counter/counter-chrdev.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/counter/counter-chrdev.c |
| +++ b/drivers/counter/counter-chrdev.c |
| @@ -247,8 +247,8 @@ static int counter_get_ext(const struct |
| if (*id == component_id) |
| return 0; |
| |
| - if (ext->type == COUNTER_COMP_ARRAY) { |
| - element = ext->priv; |
| + if (ext[*ext_idx].type == COUNTER_COMP_ARRAY) { |
| + element = ext[*ext_idx].priv; |
| |
| if (component_id - *id < element->length) |
| return 0; |