mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
win32: avoid mixing SOCKET and file descriptor space
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> Reviewed-by: Stefan Berger <stefanb@linux.ibm.com> Message-Id: <20230221124802.4103554-15-marcandre.lureau@redhat.com>
This commit is contained in:
parent
fd3c333315
commit
abe34282b0
4 changed files with 226 additions and 70 deletions
|
@ -73,15 +73,18 @@ void aio_set_fd_handler(AioContext *ctx,
|
|||
{
|
||||
AioHandler *old_node;
|
||||
AioHandler *node = NULL;
|
||||
SOCKET s;
|
||||
|
||||
if (!fd_is_socket(fd)) {
|
||||
error_report("fd=%d is not a socket, AIO implementation is missing", fd);
|
||||
return;
|
||||
}
|
||||
|
||||
s = _get_osfhandle(fd);
|
||||
|
||||
qemu_lockcnt_lock(&ctx->list_lock);
|
||||
QLIST_FOREACH(old_node, &ctx->aio_handlers, node) {
|
||||
if (old_node->pfd.fd == fd && !old_node->deleted) {
|
||||
if (old_node->pfd.fd == s && !old_node->deleted) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -92,7 +95,7 @@ void aio_set_fd_handler(AioContext *ctx,
|
|||
|
||||
/* Alloc and insert if it's not already there */
|
||||
node = g_new0(AioHandler, 1);
|
||||
node->pfd.fd = fd;
|
||||
node->pfd.fd = s;
|
||||
|
||||
node->pfd.events = 0;
|
||||
if (node->io_read) {
|
||||
|
@ -120,7 +123,7 @@ void aio_set_fd_handler(AioContext *ctx,
|
|||
|
||||
QLIST_INSERT_HEAD_RCU(&ctx->aio_handlers, node, node);
|
||||
event = event_notifier_get_handle(&ctx->notifier);
|
||||
qemu_socket_select(node->pfd.fd, event, bitmask, NULL);
|
||||
qemu_socket_select(fd, event, bitmask, NULL);
|
||||
}
|
||||
if (old_node) {
|
||||
aio_remove_fd_handler(ctx, old_node);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue