On Mon, 17 Nov 2025 15:41:08 -0300
Wander Lairson Costa <[email protected]> wrote:

> The actions_init() and actions_new() functions did not check the
> return value of calloc() and realloc() respectively. In a low
> memory situation, this could lead to a NULL pointer dereference.
> 
> Add checks for the return value of memory allocation functions
> and return an error in case of failure. Update the callers to
> handle the error properly.
> 
> Signed-off-by: Wander Lairson Costa <[email protected]>
> ---
>  tools/tracing/rtla/src/actions.c       | 26 +++++++++++++++++++++++---
>  tools/tracing/rtla/src/actions.h       |  2 +-
>  tools/tracing/rtla/src/timerlat_hist.c |  7 +++++--
>  tools/tracing/rtla/src/timerlat_top.c  |  7 +++++--
>  4 files changed, 34 insertions(+), 8 deletions(-)
> 
> diff --git a/tools/tracing/rtla/src/actions.c 
> b/tools/tracing/rtla/src/actions.c
> index 8945aee58d511..01648a1425c10 100644
> --- a/tools/tracing/rtla/src/actions.c
> +++ b/tools/tracing/rtla/src/actions.c
> @@ -11,11 +11,13 @@
>  /*
>   * actions_init - initialize struct actions
>   */
> -void
> +int
>  actions_init(struct actions *self)
>  {
>       self->size = action_default_size;
>       self->list = calloc(self->size, sizeof(struct action));
> +     if (!self->list)
> +             return -1;

Can you return -ENOMEM?

>       self->len = 0;
>       self->continue_flag = false;
>  
> @@ -23,6 +25,7 @@ actions_init(struct actions *self)
>  
>       /* This has to be set by the user */
>       self->trace_output_inst = NULL;
> +     return 0;
>  }
>  
>  /*
> @@ -50,8 +53,13 @@ static struct action *
>  actions_new(struct actions *self)
>  {
>       if (self->len >= self->size) {
> -             self->size *= 2;
> -             self->list = realloc(self->list, self->size * sizeof(struct 
> action));
> +             const size_t new_size = self->size * 2;
> +             void *p = reallocarray(self->list, new_size, sizeof(struct 
> action));
> +
> +             if (!p)
> +                     return NULL;
> +             self->list = p;
> +             self->size = new_size;
>       }
>  
>       return &self->list[self->len++];
> @@ -65,6 +73,9 @@ actions_add_trace_output(struct actions *self, const char 
> *trace_output)
>  {
>       struct action *action = actions_new(self);
>  
> +     if (!action)
> +             return -1;

I think !action should return -ENOMEM too.

> +
>       self->present[ACTION_TRACE_OUTPUT] = true;
>       action->type = ACTION_TRACE_OUTPUT;
>       action->trace_output = calloc(strlen(trace_output) + 1, sizeof(char));
> @@ -83,6 +94,9 @@ actions_add_signal(struct actions *self, int signal, int 
> pid)
>  {
>       struct action *action = actions_new(self);
>  
> +     if (!action)
> +             return -1;
> +
>       self->present[ACTION_SIGNAL] = true;
>       action->type = ACTION_SIGNAL;
>       action->signal = signal;
> @@ -99,6 +113,9 @@ actions_add_shell(struct actions *self, const char 
> *command)
>  {
>       struct action *action = actions_new(self);
>  
> +     if (!action)
> +             return -1;
> +
>       self->present[ACTION_SHELL] = true;
>       action->type = ACTION_SHELL;
>       action->command = calloc(strlen(command) + 1, sizeof(char));
> @@ -117,6 +134,9 @@ actions_add_continue(struct actions *self)
>  {
>       struct action *action = actions_new(self);
>  
> +     if (!action)
> +             return -1;
> +
>       self->present[ACTION_CONTINUE] = true;
>       action->type = ACTION_CONTINUE;
>  

The above same patterns too.

Thank you,



-- 
Masami Hiramatsu (Google) <[email protected]>

Reply via email to