https://bugs.winehq.org/show_bug.cgi?id=37135
Bug ID: 37135 Summary: Wine fails to handle EWOULDBLOCK return from sendmsg Product: Wine Version: 1.7.24 Hardware: x86 OS: Solaris Status: UNCONFIRMED Severity: critical Priority: P2 Component: -unknown Assignee: wine-bugs@winehq.org Reporter: carson@taltos.org
On Solaris 11.2, launching any application via "wine c:\somepath\foo.exe" frequently fails, printing the following errors:
sendmsg: Resource temporarily unavailable sendmsg: Resource temporarily unavailable Protocol error: process 000c: Protocol error: process 000
Debugging, I find these errors come from 2 different places. Fixing both makes wine run reliably.
server/request.c dlls/ntdll/server.c
The fix for ./dlls/ntdll/server.c is easy, just add EWOULDBLOCK to the EINTR case that's already present.
dlls/ntdll/server.c requires the addition of a loop around sendmsg as well as handling the non-fatal EWOULDBLOCK (and it should probably retry EINTR as well).
I can generate patches if desired, but the fixes are fairly obvious.
https://bugs.winehq.org/show_bug.cgi?id=37135
Claude francois.pinet@irstea.fr changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |francois.pinet@irstea.fr
--- Comment #1 from Claude francois.pinet@irstea.fr --- Thank you for these useful information. This bug makes Wine unusable on the last Solaris version (11.2) - numerous random crashes occur. The following update has fixed the issue (I have used Wine 1.7.0): 1) In procedure “send_client_fd” (server/request.c): Replace: ret = sendmsg( get_unix_fd( process->msg_fd ), &msghdr, 0 ); if (ret == sizeof(handle)) return 0; by: for (;;){ ret = sendmsg( get_unix_fd( process->msg_fd ), &msghdr, 0 ); if (ret == sizeof(handle)) return 0;} 2) In procedure “wine_server_send_fd” (dlls/ntdll/server.c) Replace: server_protocol_perror( "sendmsg" ); By: /*server_protocol_perror( "sendmsg" );*/
This is a “very dirty” update but it seems this have fixed the problem for Solaris 11.2. If someone could help to implement a reliable patch for the last versions of Wine… This will make Wine useable on the last versions of Solaris.
https://bugs.winehq.org/show_bug.cgi?id=37135
Sebastian Lackner sebastian@fds-team.de changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |sebastian@fds-team.de
--- Comment #2 from Sebastian Lackner sebastian@fds-team.de --- It sounds a bit like a workaround for a Solaris kernel bug. According to the Solaris documentations, EWOULDBLOCK should only be returned for non-blocking sockets/pipes, but these pipes should be blocking. It would probably make sense to discuss this on the wine-devel mailing list, and maybe also to involve some more Solaris developers familiar with this area.
If its really an intentional difference between Solaris/Linux, it would make sense to submit these changes, take a look here for more details about submitting patches: http://wiki.winehq.org/SubmittingPatches.
https://bugs.winehq.org/show_bug.cgi?id=37135
super_man@post.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |super_man@post.com
https://bugs.winehq.org/show_bug.cgi?id=37135
Bruno Jesus 00cpxxx@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Summary|Wine fails to handle |Solaris 11 sendmsg() |EWOULDBLOCK return from |returns unexpected |sendmsg |EWOULDBLOCK error in | |wineserver calls
--- Comment #3 from Bruno Jesus 00cpxxx@gmail.com --- This is probably still an issue in latest Wine, and still unknown if the problem is in Wine or Solaris.
https://bugs.winehq.org/show_bug.cgi?id=37135
--- Comment #4 from Claude francois.pinet@irstea.fr ---
It seems this bug has been solved in Solaris 11.3.
https://bugs.winehq.org/show_bug.cgi?id=37135
--- Comment #5 from Claude francois.pinet@irstea.fr ---
I have tested to compile and run Wine 1.7.0 and Wine 1.9.7 on Solaris 11.3.
There is no message "sendmsg: ..." and no crash related to the EWOULDBLOCK error.
The EWOULDBLOCK error seems to be related to Solaris 11.2 (i.e., the previous Solaris version)
Additional information: - A symbolic link "/usr/lib/freetype" has been created for "/usr/lib/freetype2" for the compilation - For running graphical application, Wine has been launched by "LD_PRELOAD=libumem.so UMEM_OPTIONS=backend=mmap wine" (to avoid graphical errors), but this issue was not related to the EWOULDBLOCK error.