On Mon, May 15, 2023 at 5:25 PM <marcandre.lur...@redhat.com> wrote:
> From: Marc-André Lureau <marcandre.lur...@redhat.com> > > Since commit abe34282 ("win32: avoid mixing SOCKET and file descriptor > space"), we set HANDLE_FLAG_PROTECT_FROM_CLOSE on the socket FD, to > prevent closing the HANDLE with CloseHandle. This raises an exception > which under gdb is fatal, and qemu exits. > > Let's catch the expected error instead. > > Note: this appears to work, but the mingw64 macro is not well documented > or tested, and it's not obvious how it is meant to be used. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > ping > --- > include/sysemu/os-win32.h | 4 ++++ > util/oslib-win32.c | 23 +++++++++++++++++------ > 2 files changed, 21 insertions(+), 6 deletions(-) > > diff --git a/include/sysemu/os-win32.h b/include/sysemu/os-win32.h > index 15c296e0eb..65f6c9ea57 100644 > --- a/include/sysemu/os-win32.h > +++ b/include/sysemu/os-win32.h > @@ -259,6 +259,10 @@ ssize_t qemu_recv_wrap(int sockfd, void *buf, size_t > len, int flags); > ssize_t qemu_recvfrom_wrap(int sockfd, void *buf, size_t len, int flags, > struct sockaddr *addr, socklen_t *addrlen); > > +EXCEPTION_DISPOSITION > +win32_close_exception_handler(struct _EXCEPTION_RECORD*, void*, > + struct _CONTEXT*, void*); > + > #ifdef __cplusplus > } > #endif > diff --git a/util/oslib-win32.c b/util/oslib-win32.c > index a98638729a..fafbab80b4 100644 > --- a/util/oslib-win32.c > +++ b/util/oslib-win32.c > @@ -479,6 +479,13 @@ int qemu_bind_wrap(int sockfd, const struct sockaddr > *addr, > return ret; > } > > +EXCEPTION_DISPOSITION > +win32_close_exception_handler(struct _EXCEPTION_RECORD*, > + void*, struct _CONTEXT*, void*) > +{ > + return EXCEPTION_EXECUTE_HANDLER; > +} > + > #undef close > int qemu_close_socket_osfhandle(int fd) > { > @@ -504,12 +511,16 @@ int qemu_close_socket_osfhandle(int fd) > return -1; > } > > - /* > - * close() returns EBADF since we PROTECT_FROM_CLOSE the underlying > handle, > - * but the FD is actually freed > - */ > - if (close(fd) < 0 && errno != EBADF) { > - return -1; > + __try1(win32_close_exception_handler) { > + /* > + * close() returns EBADF since we PROTECT_FROM_CLOSE the > underlying > + * handle, but the FD is actually freed > + */ > + if (close(fd) < 0 && errno != EBADF) { > + return -1; > + } > + } > + __except1 { > } > > if (!SetHandleInformation((HANDLE)s, flags, flags)) { > -- > 2.40.1 > > > -- Marc-André Lureau