http://bugs.winehq.org/show_bug.cgi?id=17296
--- Comment #83 from Juan Lang juan_lang@yahoo.com 2010-10-21 18:28:56 CDT --- At a quick glance, it looks like buffer handling is incorrect. From the logs:
trace:secur32:InitializeSecurityContextW 0x481decc (nil) L"vulcan" 524572 0 16 (nil) 0 0xa3d4c0 0xa3d458 0xa3becc 0x481dec4 trace:secur32:schan_InitializeSecurityContextW 0x1a85a0 (nil) L"vulcan" 524572 0 16 (nil) 0 0x481de08 0xa3d458 0xa3becc 0x481dec4
Here we have the first call to InitializeSecurityContext. The flags are the fourth parameter, 524572, which is 0x0008011c. The interesting one is ISC_REQ_ALLOCATE_MEMORY. The input buffer is so far empty (nil), which we expect.
trace:secur32:dump_buffer_desc Buffer desc 0xa3d458: trace:secur32:dump_buffer_desc buffer 0: cbBuffer 0, BufferType 0x2 pvBuffer (nil)
Here's the output SecBufferDesc getting traced. It's empty so far, and the call flow continues:
trace:secur32:schan_InitializeSecurityContextW Continue... (snip) trace:secur32:schan_InitializeSecurityContextW 0x1a85a0 0x1a8668 L"vulcan" 524572 0 16 0xa3d664 0 0x481dd4c 0xa3d678 0xa3becc 0x481de08
Here's the second call to InitializeSecurityContext. Note the change in the SecBufferDescs:
trace:secur32:dump_buffer_desc Buffer desc 0xa3d664: trace:secur32:dump_buffer_desc buffer 0: cbBuffer 47, BufferType 0x2 pvBuffer 0xa3d4d4 trace:secur32:dump_buffer_desc Buffer desc 0xa3d678: trace:secur32:dump_buffer_desc buffer 0: cbBuffer 0, BufferType 0x2 pvBuffer (nil)
Now the input buffer which contains 47 bytes, and the new output buffer is still empty. A little bit later we have:
trace:secur32:schan_pull Pull 5 bytes trace:secur32:schan_get_buffer Using buffer 0: cbBuffer 47, BufferType 0x2, pvBuffer 0xa3d4d4 trace:secur32:schan_get_buffer No next buffer trace:secur32:schan_gnutls_log <2> ASSERT: gnutls_buffers.c:360
Here's where the problem appears to occur. schan_get_buffer is searching the input buffer for a buffer with the type SECBUFFER_TOKEN, but there are none remaining. It seems as though either schannel should be appending new data to the input buffer, or making use of the output buffer.