Commit a6fe4f6e authored by Dmitry Timoshkov's avatar Dmitry Timoshkov Committed by Alexandre Julliard

rpcrt4: Reimplement rpcrt4_conn_np_wait_for_incoming_data() using asynchronous…

rpcrt4: Reimplement rpcrt4_conn_np_wait_for_incoming_data() using asynchronous read with zero sized buffer. The problem with NtFsControlFile(FSCTL_PIPE_PEEK) is that it happily returns STATUS_SUCCESS with 0 bytes of data available. That makes the client think that the server already sent a reply and try to read the reply data, which hangs. A solution to this is call NtReadFile() with zero sized buffer, which has correct behaviour: just waits for incoming data to appear without mangling the data in the pipe. Signed-off-by: 's avatarDmitry Timoshkov <dmitry@baikal.ru> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 86d1a24e
......@@ -465,31 +465,7 @@ static void rpcrt4_conn_np_cancel_call(RpcConnection *conn)
static int rpcrt4_conn_np_wait_for_incoming_data(RpcConnection *conn)
{
RpcConnection_np *connection = (RpcConnection_np *)conn;
FILE_PIPE_PEEK_BUFFER buf;
HANDLE event;
NTSTATUS status;
int ret;
event = get_np_event(connection);
if (!event) return -1;
status = NtFsControlFile(connection->pipe, event, NULL, NULL, &connection->io_status, FSCTL_PIPE_PEEK, NULL, 0, &buf, sizeof(buf));
if (status == STATUS_SUCCESS)
ret = 0;
else if (status == STATUS_PENDING)
{
WaitForSingleObject(event, INFINITE);
ret = 0;
}
else
{
WARN("NtFsControlFile error %08x\n", status);
ret = -1;
}
release_np_event(connection, event);
return ret;
return rpcrt4_conn_np_read(conn, NULL, 0);
}
static size_t rpcrt4_ncacn_np_get_top_of_tower(unsigned char *tower_data,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment