On Wed, Feb 15, 2023 at 03:11:45PM +0100, Laszlo Ersek wrote:
> A prior patch highlighted the following leak: whenever any construction
> step after bind() fails, the UNIX domain socket address (i.e., the
> pathname in the filesystem) is leaked. Plug the leak by inserting a new
> error handling section that unlinks the pathname.
> 
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
> 
> Notes:
>     context:-U12
> 
>  generator/states-connect-socket-activation.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/generator/states-connect-socket-activation.c 
> b/generator/states-connect-socket-activation.c
> index 164b8e6828f2..81bb850c7d8c 100644
> --- a/generator/states-connect-socket-activation.c
> +++ b/generator/states-connect-socket-activation.c
> @@ -136,30 +136,30 @@  CONNECT_SA.START:
>      goto free_sockpath;
>    }
>  
>    addr.sun_family = AF_UNIX;
>    memcpy (addr.sun_path, sockpath, strlen (sockpath) + 1);
>    if (bind (s, (struct sockaddr *) &addr, sizeof addr) == -1) {
>      set_error (errno, "bind: %s", sockpath);
>      goto close_socket;
>    }
>  
>    if (listen (s, SOMAXCONN) == -1) {
>      set_error (errno, "listen");
> -    goto close_socket;
> +    goto unlink_sockpath;
>    }
>  
>    if (prepare_socket_activation_environment (&env) == -1) {
>      set_error (errno, "prepare_socket_activation_environment");
> -    goto close_socket;
> +    goto unlink_sockpath;
>    }
>  
>    pid = fork ();
>    if (pid == -1) {
>      set_error (errno, "fork");
>      goto empty_env;
>    }
>  
>    if (pid == 0) {         /* child - run command */
>      if (s != FIRST_SOCKET_ACTIVATION_FD) {
>        if (dup2 (s, FIRST_SOCKET_ACTIVATION_FD) == -1) {
>          nbd_internal_fork_safe_perror ("dup2");
> @@ -211,24 +211,28 @@  CONNECT_SA.START:
>    h->sact_sockpath = sockpath;
>    h->pid = pid;
>  
>    h->connaddrlen = sizeof addr;
>    memcpy (&h->connaddr, &addr, h->connaddrlen);
>    next = %^CONNECT.START;
>  
>    /* fall through, for releasing the temporaries */
>  
>  empty_env:
>    string_vector_empty (&env);
>  
> +unlink_sockpath:
> +  if (next == %.DEAD)
> +    unlink (sockpath);
> +
>  close_socket:
>    close (s);
>  
>  free_sockpath:
>    if (next == %.DEAD)
>      free (sockpath);
>  
>  rmdir_tmpdir:
>    if (next == %.DEAD)
>      rmdir (tmpdir);
>  
>  free_tmpdir:

Reviewed-by: Richard W.M. Jones <rjo...@redhat.com>


-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
nbdkit - Flexible, fast NBD server with plugins
https://gitlab.com/nbdkit/nbdkit
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to