* [libgpiod][PATCH 0/4] Fix issues detected by static analyzer
@ 2024-07-17 11:36 Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 1/4] bindings: python: gpiod: avoid use after free Iker Pedrosa
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Iker Pedrosa @ 2024-07-17 11:36 UTC (permalink / raw)
To: brgl; +Cc: Iker Pedrosa, ipedrosa, javierm, perobins, linux-gpio
This patch series contain a set of fixes for several issues detected by a
static analyzer tool. They are related to wrong pointers management and
string termination.
Iker Pedrosa (4):
bindings: python: gpiod: avoid use after free
lib: line-info strings termination
lib: chip-info strings termination
tools: free to avoid leak
bindings/python/gpiod/ext/chip.c | 6 ++++--
lib/chip-info.c | 9 ++++++---
lib/line-info.c | 6 ++++--
tools/gpioinfo.c | 4 +++-
4 files changed, 17 insertions(+), 8 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* [libgpiod][PATCH 1/4] bindings: python: gpiod: avoid use after free
2024-07-17 11:36 [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Iker Pedrosa
@ 2024-07-17 11:36 ` Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 2/4] lib: line-info strings termination Iker Pedrosa
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Iker Pedrosa @ 2024-07-17 11:36 UTC (permalink / raw)
To: brgl; +Cc: Iker Pedrosa, ipedrosa, javierm, perobins, linux-gpio
`req_cfg` variable is freed and then used, which would generate an
error. Avoid this problem by freeing when the variable will no longer be
used.
Signed-off-by: Iker Pedrosa <ikerpedrosam@gmail.com>
---
bindings/python/gpiod/ext/chip.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/bindings/python/gpiod/ext/chip.c b/bindings/python/gpiod/ext/chip.c
index 28cf504..e8eaad8 100644
--- a/bindings/python/gpiod/ext/chip.c
+++ b/bindings/python/gpiod/ext/chip.c
@@ -274,14 +274,16 @@ static PyObject *chip_request_lines(chip_object *self, PyObject *args)
Py_BEGIN_ALLOW_THREADS;
request = gpiod_chip_request_lines(self->chip, req_cfg, line_cfg);
Py_END_ALLOW_THREADS;
- gpiod_request_config_free(req_cfg);
- if (!request)
+ if (!request) {
+ gpiod_request_config_free(req_cfg);
return Py_gpiod_SetErrFromErrno();
+ }
req_obj = Py_gpiod_MakeRequestObject(request,
gpiod_request_config_get_event_buffer_size(req_cfg));
if (!req_obj)
gpiod_line_request_release(request);
+ gpiod_request_config_free(req_cfg);
return req_obj;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [libgpiod][PATCH 2/4] lib: line-info strings termination
2024-07-17 11:36 [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 1/4] bindings: python: gpiod: avoid use after free Iker Pedrosa
@ 2024-07-17 11:36 ` Iker Pedrosa
2024-07-17 15:11 ` Kent Gibson
2024-07-17 11:36 ` [libgpiod][PATCH 3/4] lib: chip-info " Iker Pedrosa
` (2 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Iker Pedrosa @ 2024-07-17 11:36 UTC (permalink / raw)
To: brgl; +Cc: Iker Pedrosa, ipedrosa, javierm, perobins, linux-gpio
strncpy() truncates the destination buffer if it isn't large enough to
hold the copy. Thus, let's terminate the strings with a NULL character
at the end.
Signed-off-by: Iker Pedrosa <ikerpedrosam@gmail.com>
---
lib/line-info.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/line-info.c b/lib/line-info.c
index 9f53b04..2ded9ea 100644
--- a/lib/line-info.c
+++ b/lib/line-info.c
@@ -148,10 +148,12 @@ gpiod_line_info_from_uapi(struct gpio_v2_line_info *uapi_info)
memset(info, 0, sizeof(*info));
info->offset = uapi_info->offset;
- strncpy(info->name, uapi_info->name, GPIO_MAX_NAME_SIZE);
+ strncpy(info->name, uapi_info->name, GPIO_MAX_NAME_SIZE - 1);
+ info->name[GPIO_MAX_NAME_SIZE - 1] = '\0';
info->used = !!(uapi_info->flags & GPIO_V2_LINE_FLAG_USED);
- strncpy(info->consumer, uapi_info->consumer, GPIO_MAX_NAME_SIZE);
+ strncpy(info->consumer, uapi_info->consumer, GPIO_MAX_NAME_SIZE - 1);
+ info->consumer[GPIO_MAX_NAME_SIZE - 1] = '\0';
if (uapi_info->flags & GPIO_V2_LINE_FLAG_OUTPUT)
info->direction = GPIOD_LINE_DIRECTION_OUTPUT;
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [libgpiod][PATCH 3/4] lib: chip-info strings termination
2024-07-17 11:36 [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 1/4] bindings: python: gpiod: avoid use after free Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 2/4] lib: line-info strings termination Iker Pedrosa
@ 2024-07-17 11:36 ` Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 4/4] tools: free to avoid leak Iker Pedrosa
2024-07-19 9:33 ` [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Bartosz Golaszewski
4 siblings, 0 replies; 7+ messages in thread
From: Iker Pedrosa @ 2024-07-17 11:36 UTC (permalink / raw)
To: brgl; +Cc: Iker Pedrosa, ipedrosa, javierm, perobins, linux-gpio
strncpy() truncates the destination buffer if it isn't large enough to
hold the copy. Thus, let's terminate the strings with a NULL character
at the end.
Signed-off-by: Iker Pedrosa <ikerpedrosam@gmail.com>
---
lib/chip-info.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/lib/chip-info.c b/lib/chip-info.c
index 87fd9e7..2f2523e 100644
--- a/lib/chip-info.c
+++ b/lib/chip-info.c
@@ -57,7 +57,8 @@ gpiod_chip_info_from_uapi(struct gpiochip_info *uapi_info)
* GPIO device must have a name - don't bother checking this field. In
* the worst case (would have to be a weird kernel bug) it'll be empty.
*/
- strncpy(info->name, uapi_info->name, sizeof(info->name));
+ strncpy(info->name, uapi_info->name, sizeof(info->name) - 1);
+ info->name[sizeof(info->name) - 1] = '\0';
/*
* The kernel sets the label of a GPIO device to "unknown" if it
@@ -66,8 +67,10 @@ gpiod_chip_info_from_uapi(struct gpiochip_info *uapi_info)
*/
if (uapi_info->label[0] == '\0')
strncpy(info->label, "unknown", sizeof(info->label));
- else
- strncpy(info->label, uapi_info->label, sizeof(info->label));
+ else {
+ strncpy(info->label, uapi_info->label, sizeof(info->label) - 1);
+ info->label[sizeof(info->label) - 1] = '\0';
+ }
return info;
}
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [libgpiod][PATCH 4/4] tools: free to avoid leak
2024-07-17 11:36 [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Iker Pedrosa
` (2 preceding siblings ...)
2024-07-17 11:36 ` [libgpiod][PATCH 3/4] lib: chip-info " Iker Pedrosa
@ 2024-07-17 11:36 ` Iker Pedrosa
2024-07-19 9:33 ` [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Bartosz Golaszewski
4 siblings, 0 replies; 7+ messages in thread
From: Iker Pedrosa @ 2024-07-17 11:36 UTC (permalink / raw)
To: brgl; +Cc: Iker Pedrosa, ipedrosa, javierm, perobins, linux-gpio
`info` variable is allocated, but never freed when the loop continues.
Free it so that it isn't leaked.
Signed-off-by: Iker Pedrosa <ikerpedrosam@gmail.com>
---
tools/gpioinfo.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/gpioinfo.c b/tools/gpioinfo.c
index 44d1c8c..d5e4751 100644
--- a/tools/gpioinfo.c
+++ b/tools/gpioinfo.c
@@ -195,8 +195,10 @@ static void list_lines(struct line_resolver *resolver, struct gpiod_chip *chip,
offset, gpiod_chip_info_get_name(chip_info));
if (resolver->num_lines &&
- !resolve_line(resolver, info, chip_num))
+ !resolve_line(resolver, info, chip_num)) {
+ gpiod_line_info_free(info);
continue;
+ }
if (resolver->num_lines) {
printf("%s %u", gpiod_chip_info_get_name(chip_info),
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [libgpiod][PATCH 2/4] lib: line-info strings termination
2024-07-17 11:36 ` [libgpiod][PATCH 2/4] lib: line-info strings termination Iker Pedrosa
@ 2024-07-17 15:11 ` Kent Gibson
0 siblings, 0 replies; 7+ messages in thread
From: Kent Gibson @ 2024-07-17 15:11 UTC (permalink / raw)
To: Iker Pedrosa; +Cc: brgl, ipedrosa, javierm, perobins, linux-gpio
On Wed, Jul 17, 2024 at 01:36:42PM +0200, Iker Pedrosa wrote:
> strncpy() truncates the destination buffer if it isn't large enough to
> hold the copy. Thus, let's terminate the strings with a NULL character
> at the end.
>
> Signed-off-by: Iker Pedrosa <ikerpedrosam@gmail.com>
> ---
> lib/line-info.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/lib/line-info.c b/lib/line-info.c
> index 9f53b04..2ded9ea 100644
> --- a/lib/line-info.c
> +++ b/lib/line-info.c
> @@ -148,10 +148,12 @@ gpiod_line_info_from_uapi(struct gpio_v2_line_info *uapi_info)
> memset(info, 0, sizeof(*info));
>
> info->offset = uapi_info->offset;
> - strncpy(info->name, uapi_info->name, GPIO_MAX_NAME_SIZE);
> + strncpy(info->name, uapi_info->name, GPIO_MAX_NAME_SIZE - 1);
> + info->name[GPIO_MAX_NAME_SIZE - 1] = '\0';
>
Given that uapi_info->name is not NULL terminated, this change can
incorrectly discard one character. The correct solution is to increase
the size of info->name to allow for the NULL terminator, which would
automatically be initialised by the memset.
> info->used = !!(uapi_info->flags & GPIO_V2_LINE_FLAG_USED);
> - strncpy(info->consumer, uapi_info->consumer, GPIO_MAX_NAME_SIZE);
> + strncpy(info->consumer, uapi_info->consumer, GPIO_MAX_NAME_SIZE - 1);
> + info->consumer[GPIO_MAX_NAME_SIZE - 1] = '\0';
>
Same here.
And same in patch 3.
Patches 1 and 4 look ok to me.
Cheers,
Kent.
> if (uapi_info->flags & GPIO_V2_LINE_FLAG_OUTPUT)
> info->direction = GPIOD_LINE_DIRECTION_OUTPUT;
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [libgpiod][PATCH 0/4] Fix issues detected by static analyzer
2024-07-17 11:36 [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Iker Pedrosa
` (3 preceding siblings ...)
2024-07-17 11:36 ` [libgpiod][PATCH 4/4] tools: free to avoid leak Iker Pedrosa
@ 2024-07-19 9:33 ` Bartosz Golaszewski
4 siblings, 0 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2024-07-19 9:33 UTC (permalink / raw)
To: Iker Pedrosa; +Cc: ipedrosa, javierm, perobins, linux-gpio
On Wed, Jul 17, 2024 at 1:37 PM Iker Pedrosa <ikerpedrosam@gmail.com> wrote:
>
> This patch series contain a set of fixes for several issues detected by a
> static analyzer tool. They are related to wrong pointers management and
> string termination.
>
What is the static analyzer you used for this?
Bart
> Iker Pedrosa (4):
> bindings: python: gpiod: avoid use after free
> lib: line-info strings termination
> lib: chip-info strings termination
> tools: free to avoid leak
>
> bindings/python/gpiod/ext/chip.c | 6 ++++--
> lib/chip-info.c | 9 ++++++---
> lib/line-info.c | 6 ++++--
> tools/gpioinfo.c | 4 +++-
> 4 files changed, 17 insertions(+), 8 deletions(-)
>
> --
> 2.45.2
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-07-19 9:33 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-17 11:36 [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 1/4] bindings: python: gpiod: avoid use after free Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 2/4] lib: line-info strings termination Iker Pedrosa
2024-07-17 15:11 ` Kent Gibson
2024-07-17 11:36 ` [libgpiod][PATCH 3/4] lib: chip-info " Iker Pedrosa
2024-07-17 11:36 ` [libgpiod][PATCH 4/4] tools: free to avoid leak Iker Pedrosa
2024-07-19 9:33 ` [libgpiod][PATCH 0/4] Fix issues detected by static analyzer Bartosz Golaszewski
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.