On Wed, Feb 15, 2023 at 03:11:48PM +0100, Laszlo Ersek wrote:
> Furthermore, explain in a comment that *not* calling set_error() upon
> nbd_internal_socket_create() failing is intentional, and not an omission.
> 
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
> 
> Notes:
>     context:-W
> 
>  generator/states-connect.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/generator/states-connect.c b/generator/states-connect.c
> index 95a96b9114c6..83d7f316828e 100644
> --- a/generator/states-connect.c
> +++ b/generator/states-connect.c
> @@ -240,71 +240,73 @@  CONNECT_TCP.NEXT_ADDRESS:
>   CONNECT_COMMAND.START:
>    int sv[2];
>    pid_t pid;
>    int flags;
>  
>    assert (!h->sock);
>    assert (h->argv.ptr);
>    assert (h->argv.ptr[0]);
>    if (nbd_internal_socketpair (AF_UNIX, SOCK_STREAM, 0, sv) == -1) {
>      SET_NEXT_STATE (%.DEAD);
>      set_error (errno, "socketpair");
>      return 0;
>    }
>  
>    pid = fork ();
>    if (pid == -1) {
>      SET_NEXT_STATE (%.DEAD);
>      set_error (errno, "fork");
>      close (sv[0]);
>      close (sv[1]);
>      return 0;
>    }
>    if (pid == 0) {         /* child - run command */
>      close (0);
>      close (1);
>      close (sv[0]);
>      dup2 (sv[1], 0);
>      dup2 (sv[1], 1);
>      close (sv[1]);
>  
>      /* Restore SIGPIPE back to SIG_DFL. */
>      signal (SIGPIPE, SIG_DFL);
>  
>      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 (sv[1]);
>  
>    h->pid = pid;
>  
>    /* Only the parent-side end of the socket pair must be set to non-blocking,
>     * because the child may not be expecting a non-blocking socket.
>     */
>    flags = fcntl (sv[0], F_GETFL, 0);
>    if (flags == -1 ||
>        fcntl (sv[0], F_SETFL, flags|O_NONBLOCK) == -1) {
>      SET_NEXT_STATE (%.DEAD);
> +    set_error (errno, "fcntl");
>      close (sv[0]);
>      return 0;
>    }
>  
>    h->sock = nbd_internal_socket_create (sv[0]);
>    if (!h->sock) {
>      SET_NEXT_STATE (%.DEAD);
> +    /* nbd_internal_socket_create() calls set_error() internally */
>      close (sv[0]);
>      return 0;
>    }
>  
>    /* The sockets are connected already, we can jump directly to
>     * receiving the server magic.
>     */
>    SET_NEXT_STATE (%^MAGIC.START);
>    return 0;
>  
>  } /* END STATE MACHINE */

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