On Wed, Feb 15, 2023 at 03:11:43PM +0100, Laszlo Ersek wrote:
> It's bad hygiene to just assume dup2(), close() and signal() will succeed,
> especially considering the inconsistency that we do check fcntl(). Check
> all return values.
> 
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
> 
> Notes:
>     context:-U12
> 
>  generator/states-connect-socket-activation.c | 15 ++++++++++++---
>  1 file changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/generator/states-connect-socket-activation.c 
> b/generator/states-connect-socket-activation.c
> index 729f37d897fb..766f46177bf3 100644
> --- a/generator/states-connect-socket-activation.c
> +++ b/generator/states-connect-socket-activation.c
> @@ -161,50 +161,59 @@  CONNECT_SA.START:
>    }
>  
>    pid = fork ();
>    if (pid == -1) {
>      SET_NEXT_STATE (%.DEAD);
>      set_error (errno, "fork");
>      close (s);
>      string_vector_empty (&env);
>      return 0;
>    }
>    if (pid == 0) {         /* child - run command */
>      if (s != FIRST_SOCKET_ACTIVATION_FD) {
> -      dup2 (s, FIRST_SOCKET_ACTIVATION_FD);
> -      close (s);
> +      if (dup2 (s, FIRST_SOCKET_ACTIVATION_FD) == -1) {
> +        nbd_internal_fork_safe_perror ("dup2");
> +        _exit (126);
> +      }
> +      if (close (s) == -1) {
> +        nbd_internal_fork_safe_perror ("close");
> +        _exit (126);
> +      }
>      }
>      else {
>        /* We must unset CLOEXEC on the fd.  (dup2 above does this
>         * implicitly because CLOEXEC is set on the fd, not on the
>         * socket).
>         */
>        int flags = fcntl (s, F_GETFD, 0);
>        if (flags == -1) {
>          nbd_internal_fork_safe_perror ("fcntl: F_GETFD");
>          _exit (126);
>        }
>        if (fcntl (s, F_SETFD, (int)(flags & ~(unsigned)FD_CLOEXEC)) == -1) {
>          nbd_internal_fork_safe_perror ("fcntl: F_SETFD");
>          _exit (126);
>        }
>      }
>  
>      char buf[32];
>      const char *v =
>        nbd_internal_fork_safe_itoa ((long) getpid (), buf, sizeof buf);
>      strcpy (&env.ptr[0][PREFIX_LENGTH], v);
>  
>      /* Restore SIGPIPE back to SIG_DFL. */
> -    signal (SIGPIPE, SIG_DFL);
> +    if (signal (SIGPIPE, SIG_DFL) == SIG_ERR) {
> +      nbd_internal_fork_safe_perror ("signal");
> +      _exit (126);
> +    }
>  
>      environ = env.ptr;
>      execvp (h->argv.ptr[0], h->argv.ptr);
>      nbd_internal_fork_safe_perror (h->argv.ptr[0]);
>      if (errno == ENOENT)
>        _exit (127);
>      else
>        _exit (126);
>    }
>  
>    /* Parent. */
>    close (s);

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
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to