Mike McCormack : rpcrt4: Make RPCRT4_Receive more compatible with read(2).

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 19 13:15:03 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 9a4abffa180e3fc2c8e08890f47443e1e014cbfa
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=9a4abffa180e3fc2c8e08890f47443e1e014cbfa

Author: Mike McCormack <mike at codeweavers.com>
Date:   Wed Apr 19 20:57:00 2006 +0900

rpcrt4: Make RPCRT4_Receive more compatible with read(2).

---

 dlls/rpcrt4/rpc_message.c |   51 +++++++++++++++++++--------------------------
 1 files changed, 21 insertions(+), 30 deletions(-)

diff --git a/dlls/rpcrt4/rpc_message.c b/dlls/rpcrt4/rpc_message.c
index d47f9d9..7fe5e6a 100644
--- a/dlls/rpcrt4/rpc_message.c
+++ b/dlls/rpcrt4/rpc_message.c
@@ -290,6 +290,21 @@ RPC_STATUS RPCRT4_Send(RpcConnection *Co
 }
 
 /***********************************************************************
+ *           rpcrt4_conn_read (internal)
+ *
+ * Reads data from a connection
+ */
+static int rpcrt4_conn_read(RpcConnection *Connection,
+                            void *buffer, unsigned int count)
+{
+  DWORD dwRead = 0;
+  if (!ReadFile(Connection->conn, buffer, count, &dwRead, NULL) &&
+      (GetLastError() != ERROR_MORE_DATA))
+    return -1;
+  return dwRead;
+}
+
+/***********************************************************************
  *           RPCRT4_Receive (internal)
  * 
  * Receive a packet from connection and merge the fragments.
@@ -298,7 +313,8 @@ RPC_STATUS RPCRT4_Receive(RpcConnection 
                           PRPC_MESSAGE pMsg)
 {
   RPC_STATUS status;
-  DWORD dwRead, hdr_length;
+  DWORD hdr_length;
+  LONG dwRead;
   unsigned short first_flag;
   unsigned long data_length;
   unsigned long buffer_length;
@@ -310,13 +326,7 @@ RPC_STATUS RPCRT4_Receive(RpcConnection 
   TRACE("(%p, %p, %p)\n", Connection, Header, pMsg);
 
   /* read packet common header */
-  if (!ReadFile(Connection->conn, &common_hdr, sizeof(common_hdr), &dwRead, NULL)) {
-    if (GetLastError() != ERROR_MORE_DATA) {
-      WARN("ReadFile failed with error %ld\n", GetLastError());
-      status = RPC_S_PROTOCOL_ERROR;
-      goto fail;
-    }
-  }
+  dwRead = rpcrt4_conn_read(Connection, &common_hdr, sizeof(common_hdr));
   if (dwRead != sizeof(common_hdr)) {
     WARN("Short read of header, %ld/%d bytes\n", dwRead, sizeof(common_hdr));
     status = RPC_S_PROTOCOL_ERROR;
@@ -342,14 +352,7 @@ RPC_STATUS RPCRT4_Receive(RpcConnection 
   memcpy(*Header, &common_hdr, sizeof(common_hdr));
 
   /* read the rest of packet header */
-  if (!ReadFile(Connection->conn, &(*Header)->common + 1,
-                hdr_length - sizeof(common_hdr), &dwRead, NULL)) {
-    if (GetLastError() != ERROR_MORE_DATA) {
-      WARN("ReadFile failed with error %ld\n", GetLastError());
-      status = RPC_S_PROTOCOL_ERROR;
-      goto fail;
-    }
-  }
+  dwRead = rpcrt4_conn_read(Connection, &(*Header)->common + 1, hdr_length - sizeof(common_hdr));
   if (dwRead != hdr_length - sizeof(common_hdr)) {
     WARN("bad header length, %ld/%ld bytes\n", dwRead, hdr_length - sizeof(common_hdr));
     status = RPC_S_PROTOCOL_ERROR;
@@ -387,13 +390,7 @@ RPC_STATUS RPCRT4_Receive(RpcConnection 
     }
 
     if (data_length == 0) dwRead = 0; else
-    if (!ReadFile(Connection->conn, buffer_ptr, data_length, &dwRead, NULL)) {
-      if (GetLastError() != ERROR_MORE_DATA) {
-        WARN("ReadFile failed with error %ld\n", GetLastError());
-        status = RPC_S_PROTOCOL_ERROR;
-        goto fail;
-      }
-    }
+    dwRead = rpcrt4_conn_read(Connection, buffer_ptr, data_length);
     if (dwRead != data_length) {
       WARN("bad data length, %ld/%ld\n", dwRead, data_length);
       status = RPC_S_PROTOCOL_ERROR;
@@ -413,13 +410,7 @@ RPC_STATUS RPCRT4_Receive(RpcConnection 
       TRACE("next header\n");
 
       /* read the header of next packet */
-      if (!ReadFile(Connection->conn, *Header, hdr_length, &dwRead, NULL)) {
-        if (GetLastError() != ERROR_MORE_DATA) {
-          WARN("ReadFile failed with error %ld\n", GetLastError());
-          status = GetLastError();
-          goto fail;
-        }
-      }
+      dwRead = rpcrt4_conn_read(Connection, *Header, hdr_length);
       if (dwRead != hdr_length) {
         WARN("invalid packet header size (%ld)\n", dwRead);
         status = RPC_S_PROTOCOL_ERROR;




More information about the wine-cvs mailing list