qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] qga: fix possible memory leak


From: Konstantin Kostiuk
Subject: Re: [PATCH] qga: fix possible memory leak
Date: Thu, 22 Sep 2022 10:39:01 +0300





On Wed, Sep 21, 2022 at 5:53 PM Markus Armbruster <armbru@redhat.com> wrote:
luzhipeng <luzhipeng@cestc.cn> writes:

> From: lu zhipeng <luzhipeng@cestc.cn>
>
> Signed-off-by: lu zhipeng <luzhipeng@cestc.cn>
> ---
>  qga/main.c | 19 ++++++++++++++-----
>  1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/qga/main.c b/qga/main.c
> index 5f1efa2333..73ea1aae65 100644
> --- a/qga/main.c
> +++ b/qga/main.c
> @@ -1287,7 +1287,7 @@ static GAState *initialize_agent(GAConfig *config, int socket_activation)
>      if (g_mkdir_with_parents(config->state_dir, S_IRWXU) == -1) {
>          g_critical("unable to create (an ancestor of) the state directory"
>                     " '%s': %s", config->state_dir, strerror(errno));
> -        return NULL;
> +        goto failed;
>      }
>  #endif

> @@ -1312,7 +1312,7 @@ static GAState *initialize_agent(GAConfig *config, int socket_activation)
>              if (!log_file) {
>                  g_critical("unable to open specified log file: %s",
>                             strerror(errno));
> -                return NULL;
> +                goto failed;
>              }
>              s->log_file = log_file;
>          }
> @@ -1323,7 +1323,7 @@ static GAState *initialize_agent(GAConfig *config, int socket_activation)
>                                 s->pstate_filepath,
>                                 ga_is_frozen(s))) {
>          g_critical("failed to load persistent state");
> -        return NULL;
> +        goto failed;
>      }

>      config->blacklist = ga_command_blacklist_init(config->blacklist);
> @@ -1344,7 +1344,7 @@ static GAState *initialize_agent(GAConfig *config, int socket_activation)
>  #ifndef _WIN32
>      if (!register_signal_handlers()) {
>          g_critical("failed to register signal handlers");
> -        return NULL;
> +        goto failed;
>      }
>  #endif

> @@ -1357,12 +1357,21 @@ static GAState *initialize_agent(GAConfig *config, int socket_activation)
>      s->wakeup_event = CreateEvent(NULL, TRUE, FALSE, TEXT("WakeUp"));
>      if (s->wakeup_event == NULL) {
>          g_critical("CreateEvent failed");
> -        return NULL;
> +        goto failed;
>      }
>  #endif

>      ga_state = s;
>      return s;
> +
> +failed:
> +    g_free(s->pstate_filepath);
> +    g_free(s->state_filepath_isfrozen);
> +    if (s->log_file && s->log_file != stderr) {
> +        fclose(s->log_file);
> +    }
> +    g_free(s);

I think we can just add g_autofree/g_autoptr for all pointers in GAState and GLib will clean it automatically

 
> +    return NULL;
>  }

>  static void cleanup_agent(GAState *s)

The function's only caller is main():

   int main(int argc, char **argv)
   {
       int ret = EXIT_SUCCESS;

       ...

       s = initialize_agent(config, socket_activation);
       if (!s) {
           g_critical("error initializing guest agent");
           goto end;
       }

       ...

   end:
       if (config->daemonize) {
           unlink(config->pid_filepath);
       }

       config_free(config);

       return ret;
   }

When initialize_agent() fails, the process terminates immediately.
There is no memory leak.

We might want to free in initialize_agent() anyway.  Up to the
maintainer.

Bug (not related to this patch): when initialize_agent() fails, we still
terminate successfully.  We should ret = EXIT_FAILURE before goto end,
like we do elsewhere in main().

Yes, I agree with this.
 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]