Module: wine Branch: refs/heads/master Commit: c1dce86f1ffa7a8bc2dcc11da1bf5d922d89a130 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c1dce86f1ffa7a8bc2dcc11d...
Author: Mike McCormack mike@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;