Mike McCormack : wininet: Fix peeking of http data with a nul byte in it.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 5 12:10:10 CDT 2006


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

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

wininet: Fix peeking of http data with a nul byte in it.

---

 dlls/wininet/internet.h      |    1 +
 dlls/wininet/netconnection.c |   21 ++++++++++-----------
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 8043e4c..8564b15 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -63,6 +63,7 @@ #ifdef HAVE_OPENSSL_SSL_H
     SSL *ssl_s;
     char *peek_msg;
     char *peek_msg_mem;
+    size_t peek_len;
 #endif
 } WININET_NETCONNECTION;
 
diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c
index 0c9d06f..dd47fe5 100644
--- a/dlls/wininet/netconnection.c
+++ b/dlls/wininet/netconnection.c
@@ -305,6 +305,7 @@ #if defined HAVE_OPENSSL_SSL_H && define
         HeapFree(GetProcessHeap(),0,connection->peek_msg_mem);
         connection->peek_msg = NULL;
         connection->peek_msg_mem = NULL;
+        connection->peek_len = 0;
 
         pSSL_shutdown(connection->ssl_s);
         pSSL_free(connection->ssl_s);
@@ -520,19 +521,19 @@ #if defined HAVE_OPENSSL_SSL_H && define
 	}
 	else if (flags & MSG_PEEK && connection->peek_msg)
 	{
-	    size_t peek_msg_len = strlen(connection->peek_msg);
-	    if (len < peek_msg_len)
+	    if (len < connection->peek_len)
 		FIXME("buffer isn't big enough. Do the expect us to wrap?\n");
-	    memcpy(buf, connection->peek_msg, min(len,peek_msg_len+1));
-	    *recvd = min(len, peek_msg_len);
+	    *recvd = min(len, connection->peek_len);
+	    memcpy(buf, connection->peek_msg, *recvd);
             return TRUE;
 	}
 	else if (connection->peek_msg)
 	{
-	    size_t peek_msg_len = strlen(connection->peek_msg);
-	    memcpy(buf, connection->peek_msg, min(len,peek_msg_len+1));
-	    connection->peek_msg += *recvd = min(len, peek_msg_len);
-	    if (*connection->peek_msg == '\0' || *(connection->peek_msg - 1) == '\0')
+	    *recvd = min(len, connection->peek_len);
+	    memcpy(buf, connection->peek_msg, *recvd);
+	    connection->peek_len -= *recvd;
+	    connection->peek_msg += *recvd;
+	    if (connection->peek_len == 0)
 	    {
 		HeapFree(GetProcessHeap(), 0, connection->peek_msg_mem);
 		connection->peek_msg_mem = NULL;
@@ -543,6 +544,7 @@ #if defined HAVE_OPENSSL_SSL_H && define
 	*recvd = pSSL_read(connection->ssl_s, buf, len);
 	if (flags & MSG_PEEK) /* must copy stuff into buffer */
 	{
+            connection->peek_len = *recvd;
 	    if (!*recvd)
 	    {
 		HeapFree(GetProcessHeap(), 0, connection->peek_msg_mem);
@@ -550,10 +552,7 @@ #if defined HAVE_OPENSSL_SSL_H && define
 		connection->peek_msg = NULL;
 	    }
 	    else
-	    {
 		memcpy(connection->peek_msg, buf, *recvd);
-		connection->peek_msg[*recvd] = '\0';
-	    }
 	}
 	if (*recvd < 1 && len)
             return FALSE;




More information about the wine-cvs mailing list