Rémi Bernon (@rbernon) commented about dlls/ntdll/unix/sync.c:
+ { + if (!(ret = wine_server_call( req ))) handle = wine_server_ptr_handle( reply->handle ); + } + SERVER_END_REQ; + + if (!ret) + { + if (!server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL )) + { + if (InterlockedCompareExchange( &device, fd, -2 ) != -2) + { + /* someone beat us to it */ + if (needs_close) close( fd ); + NtClose( handle ); + } + /* otherwise don't close the device */ This effectively leaks the handle? We have the fd cached, why do we care about the handle? What about something like that:
``` if (ret || server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL )) fd = -1; if (InterlockedCompareExchange( &device, fd, -2 ) != -2 && fd != -1 && needs_close) close( fd ); NtClose( handle ); ``` -- https://gitlab.winehq.org/wine/wine/-/merge_requests/7226#note_93874