[Bug 42377] New: WSASend() returns invalid number of bytes when both lpOverlapped and lpNumberOfBytesSent

wine-bugs at winehq.org wine-bugs at winehq.org
Sat Feb 4 13:15:14 CST 2017


https://bugs.winehq.org/show_bug.cgi?id=42377

            Bug ID: 42377
           Summary: WSASend() returns invalid number of bytes when both
                    lpOverlapped and lpNumberOfBytesSent
           Product: Wine
           Version: 2.0-rc5
          Hardware: x86
                OS: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: -unknown
          Assignee: wine-bugs at winehq.org
          Reporter: zbr at ioremap.net
      Distribution: ---

Created attachment 57161
  --> https://bugs.winehq.org/attachment.cgi?id=57161
WINEDEBUG=+all ./grtest_server

Golang uses overlapped sockets, but sets both lpOverlapped and
lpNumberOfBytesSent.
Sometimes lpNumberOfBytesSent is returned to be higher than number of bytes in
the buffer to be sent, this breaks overlapped state machine in golang, which
eventually ends up with error and connection reset.

Bug is 100% reproducible, but it requires quite a setup.
First, golang uses memory mapped page hack to get time structures. These are
not updated by wine (see the bug here:
https://bugs.winehq.org/show_bug.cgi?id=29168). To fix it I made a patch for
golang which falls back to QPC timings if startup code detects timer is
stalled, see patches and discussion:
https://go-review.googlesource.com/#/c/35710/
https://github.com/golang/go/issues/18537

After golang has been patched, I use this test case to compile a grpc server
and python client: https://github.com/bioothod/grpc_test

# edit Makefile to specify golang path and root directory
$ make windows
$ wine ./grpc_server
$ python client.py
...

Running multiple clients 100% ends up with connection close errors, which I
debugged to incorrect (larger than the buffer size) lpNumberOfBytesSent

Here is a discussion: https://github.com/golang/go/issues/18887

Turning overlapped feature off (by setting lpOverlapped to NULL) resolves the
bug, but as far as I understand it ends up with blocked WSASend() call, who
will wait for buffer to be completely sent, which is kind of undesired
behaviour.

Attached WINEDEBUG=+all ./grtest_server log if it helps.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list