On Thu, Apr 27, 2017 at 06:24:17PM +0200, Markus Armbruster wrote:
> No review, just an observation.
> 
> Mao Zhongyi <maozy.f...@cn.fujitsu.com> writes:
> 
> > Currently, net_socket_mcast_create(), net_socket_fd_init_dgram() and
> > net_socket_fd_init() use the function such as fprintf(), perror() to
> > report an error message.
> >
> > Now, convert these functions to Error.
> >
> > CC: jasow...@redhat.com, arm...@redhat.com
> > Signed-off-by: Mao Zhongyi <maozy.f...@cn.fujitsu.com>
> > ---
> >  net/socket.c | 66 
> > +++++++++++++++++++++++++++++++++++++-----------------------
> >  1 file changed, 41 insertions(+), 25 deletions(-)
> >
> > diff --git a/net/socket.c b/net/socket.c
> > index b0decbe..559e09a 100644
> > --- a/net/socket.c
> > +++ b/net/socket.c
> [...]
> > @@ -433,25 +437,27 @@ static NetSocketState 
> > *net_socket_fd_init_stream(NetClientState *peer,
> >  
> >  static NetSocketState *net_socket_fd_init(NetClientState *peer,
> >                                            const char *model, const char 
> > *name,
> > -                                          int fd, int is_connected)
> > +                                          int fd, int is_connected,
> > +                                          Error **errp)
> >  {
> >      int so_type = -1, optlen=sizeof(so_type);
> >  
> >      if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
> >          (socklen_t *)&optlen)< 0) {
> > -        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d 
> > failed\n",
> > +        error_setg(errp, "qemu: error: getsockopt(SO_TYPE) for fd=%d 
> > failed",
> >                  fd);
> >          closesocket(fd);
> >          return NULL;
> >      }
> >      switch(so_type) {
> >      case SOCK_DGRAM:
> > -        return net_socket_fd_init_dgram(peer, model, name, fd, 
> > is_connected);
> > +        return net_socket_fd_init_dgram(peer, model, name, fd, 
> > is_connected, errp);
> >      case SOCK_STREAM:
> >          return net_socket_fd_init_stream(peer, model, name, fd, 
> > is_connected);
> >      default:
> >          /* who knows ... this could be a eg. a pty, do warn and continue 
> > as stream */
> > -        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not 
> > SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
> > +        error_setg(errp, "qemu: warning: socket type=%d for fd=%d is not 
> > SOCK_DGRAM"
> > +                   " or SOCK_STREAM", so_type, fd);
> 
> Not this patches problem: this case is odd, and the comment is bogus.
> If @fd really was a pty, getsockopt() would fail with ENOTSOCK, wouldn't
> it?  If @fd is a socket, but neither SOCK_DGRAM nor SOCK_STREAM (say
> SOCK_RAW), why is it safe to continue as if it was SOCK_STREAM?  Jason?

IMHO it is a problem with this patch. Previously we merely printed
a warning & carried on, which is conceptually ok in general, though
dubious here for the reason you say.

Now we are filling an Error **errp object, and carrying on - this is
conceptually broken anywhere. If an Error ** is filled, we must return.
If we want to carry on, we shouldn't fill Error **.

> 
> >          return net_socket_fd_init_stream(peer, model, name, fd, 
> > is_connected);

IMHO, we just kill this and put return NULL here. If there is a genuine
reason to support something like SOCK_RAW, it should be explicitly
handled, because this default: case will certainly break SOCK_SEQPACKET
and SOCK_RDM which can't be treated as streams.

> >      }
> >      return NULL;
> 
> Not reachable.  Ugly, but not your patch's concern.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

Reply via email to