On Wed, Sep 21, 2022 at 5:53 PM Markus Armbruster <arm...@redhat.com> wrote:

> luzhipeng <luzhip...@cestc.cn> writes:
>
> > From: lu zhipeng <luzhip...@cestc.cn>
> >
> > Signed-off-by: lu zhipeng <luzhip...@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