qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 14/16] win32: avoid mixing SOCKET and file descriptor spac


From: Marc-André Lureau
Subject: Re: [PATCH v3 14/16] win32: avoid mixing SOCKET and file descriptor space
Date: Mon, 6 Mar 2023 11:54:00 +0400

Hi

On Fri, Mar 3, 2023 at 12:54 AM Stefan Berger <stefanb@linux.ibm.com> wrote:
>
>
>
> On 2/21/23 07:47, marcandre.lureau@redhat.com wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> > Until now, a win32 SOCKET handle is often cast to an int file
> > descriptor, as this is what other OS use for sockets. When necessary,
> > QEMU eventually queries whether it's a socket with the help of
> > fd_is_socket(). However, there is no guarantee of conflict between the
> > fd and SOCKET space. Such conflict would have surprising consequences,
> > we shouldn't mix them.
> >
> > Also, it is often forgotten that SOCKET must be closed with
> > closesocket(), and not close().
> >
> > Instead, let's make the win32 socket wrapper functions return and take a
> > file descriptor, and let util/ wrappers do the fd/SOCKET conversion as
> > necessary. A bit of adaptation is necessary in io/ as well.
> >
> > Unfortunately, we can't drop closesocket() usage, despite
> > _open_osfhandle() documentation claiming transfer of ownership, testing
> > shows bad behaviour if you forget to call closesocket().
> >
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >   include/sysemu/os-win32.h |   4 +-
> >   io/channel-watch.c        |   6 +-
> >   util/aio-win32.c          |   9 +-
> >   util/oslib-win32.c        | 219 ++++++++++++++++++++++++++++++++------
> >   4 files changed, 197 insertions(+), 41 deletions(-)
>
> >   #undef connect
> > @@ -308,7 +315,13 @@ int qemu_connect_wrap(int sockfd, const struct 
> > sockaddr *addr,
> >                         socklen_t addrlen)
> >   {
> >       int ret;
> > -    ret = connect(sockfd, addr, addrlen);
> > +    SOCKET s = _get_osfhandle(sockfd);
> > +
> > +    if (s == INVALID_SOCKET) {
> > +        return -1;
> > +    }
> > +
> > +    ret = connect(s, addr, addrlen);
>
>
> Previously you passed int sockfd and now you convert this sockfd to a SOCKET 
> s and you can pass this as an alternative? Or was sockfd before this patch a 
> SOCKET??

yes, sockfd was in fact a SOCKET.

Previous to this patch, a SOCKET is cast to int, as a fake fd, and
back to SOCKET as necessary. The whole point of this patch is to avoid
mixing SOCKET & fd space, instead a SOCKET is associated with a real
CRT fd.

thanks

-- 
Marc-André Lureau



reply via email to

[Prev in Thread] Current Thread [Next in Thread]