[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[pkg-wine-party] Bug#836911: /usr/bin/winecfg-development: winecfg-development is a fork bomb



On 07.09.2016 20:27, Jens Reyer wrote:
> I think I can reproduce this: Wine starts a
> wineserver which all other Wine processes connect to. This wineserver
> has to be from the same build as the connecting process. Now if wine
> (stable)'s wineserver is already running and I then start
> wine-development I can observe this issue.

It seems that in the Debian packaging SERVER_PROTOCOL_VERSION is always
1, and thus the check if server and clients match doesn't work.

Testing between Debian's and winehq's versions I get e.g.:

$ /usr/lib/wine-development/wine winecfg
$ /usr/lib/wine-development/wine winecfg
--> OK, 2 winecfg windows

$ /usr/lib/wine/wine winecfg
$ /usr/lib/wine-development/wine winecfg
--> fork bomb (use "wineserver -k" to avoid system crash)

$ /opt/wine-devel/bin/wine winecfg
$ /usr/lib/wine/wine winecfg
wine client error:0: version mismatch 515/1.
Your wine binary was not upgraded correctly,
or you have an older one somewhere in your PATH.
Or maybe the wrong wineserver is still running?
--> OK, mismatch detected

$ /opt/wine-devel/bin/wine winecfg
$ /opt/wine-staging/bin/wine winecfg
wine client error:0: version mismatch 515/516.
Your wineserver binary was not upgraded correctly,
or you have an older one somewhere in your PATH.
Or maybe the wrong wineserver is still running?
--> OK, mismatch detected



Attached patch is a dirty workaround for this, by always setting the
SERVER_PROTOCOL_VERSION to 2. So if we apply this to e.g.
src:wine-development, but not to src:wine, it will be detected if a
client tries to connect to a mismatching wineserver from the other set:

$ /usr/lib/wine-development/wine winecfg
$ /usr/lib/wine/wine winecfg
wine client error:0: version mismatch 2/1.
Your wine binary was not upgraded correctly,
or you have an older one somewhere in your PATH.
Or maybe the wrong wineserver is still running?
--> OK, mismatch detected



However this workaround doesn't catch any version incompatibilities.

So far I found that:

internally SERVER_PROTOCOL_VERSION is SERVER_PROT.

tools/make_requests puts this in include/wine/server_protocol.h.new

include/wine/server_protocol.h in git has:
#define SERVER_PROTOCOL_VERSION 515
This number seems to be updated with every relevant change.

I assume generate/request.patch is incomplete, and needs to be fixed to
correctly produce the right SERVER_PROTOCOL_VERSION. But I don't know if
I can come up with a real fix. Any help would be appreciated!



Other diagnosis (dead ends):

- /tmp/.wine-$uid gets created.
- I removed all /usr/bin/wine* and replaced the wineserver script
  by the binary to rule out the alternatives system and our
  scripts/link setup as reason for this.
  But I assume the alternatives system just led people to playing
  with wine and wine-development, which exposed this bug much
  more, see also #836566.
- I built without the shlib-exit-calls.patch.

Greets
jre
diff --git a/debian/patches/generate/request.patch b/debian/patches/generate/request.patch
index 9c3f1c9..8bde81c 100644
--- a/debian/patches/generate/request.patch
+++ b/debian/patches/generate/request.patch
@@ -3,6 +3,15 @@ author: Michael Gilbert <mgilbert@debian.org>
 
 --- a/tools/make_requests
 +++ b/tools/make_requests
+@@ -397,7 +397,7 @@ print SERVER_PROT "    struct reply_head
+ foreach my $req (@requests) { print SERVER_PROT "    struct ${req}_reply ${req}_reply;\n"; }
+ print SERVER_PROT "};\n\n";
+ 
+-printf SERVER_PROT "#define SERVER_PROTOCOL_VERSION %d\n\n", $protocol + 1;
++printf SERVER_PROT "#define SERVER_PROTOCOL_VERSION %d\n\n", $protocol + 2;
+ print SERVER_PROT "#endif /* __WINE_WINE_SERVER_PROTOCOL_H */\n";
+ close SERVER_PROT;
+ update_file( "include/wine/server_protocol.h" );
 @@ -437,7 +437,7 @@ foreach my $err (sort keys %errors)
  push @trace_lines, "    { NULL, 0 }\n";
  push @trace_lines, "};\n";

Reply to: