Skip to content
Snippets Groups Projects
  • Marc-André Lureau's avatar
    abe34282
    win32: avoid mixing SOCKET and file descriptor space · abe34282
    Marc-André Lureau authored
    
    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: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Reviewed-by: default avatarStefan Berger <stefanb@linux.ibm.com>
    Message-Id: <20230221124802.4103554-15-marcandre.lureau@redhat.com>
    abe34282
    History
    win32: avoid mixing SOCKET and file descriptor space
    Marc-André Lureau authored
    
    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: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Reviewed-by: default avatarStefan Berger <stefanb@linux.ibm.com>
    Message-Id: <20230221124802.4103554-15-marcandre.lureau@redhat.com>