[dlls/wininet/netconnection.c] Strncpy elimination.

Peter Berg Larsen pebl at math.ku.dk
Sun Mar 27 13:39:03 CST 2005


The hack of peek_msg is hard to follow with respect to when the strings
are \0 terminated.

Apparently peek_msg must be \0 terminated as strlen is called.
So return array buf can be \0 terminated if large enough. The return
recvd always returns the size without \0!?

Changelog:
	Change strncpy to memcpy.


Index: dlls/wininet/netconnection.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/netconnection.c,v
retrieving revision 1.12
diff -u -r1.12 netconnection.c
--- dlls/wininet/netconnection.c	25 Feb 2005 14:07:56 -0000	1.12
+++ dlls/wininet/netconnection.c	26 Mar 2005 09:41:40 -0000
@@ -354,16 +354,18 @@
 	}
 	else if (flags & MSG_PEEK && peek_msg)
 	{
-	    if (len < strlen(peek_msg))
+	    size_t peek_msg_len = strlen(peek_msg);
+	    if (len < peek_msg_len)
 		FIXME("buffer isn't big enough. Do the expect us to wrap?\n");
-	    strncpy(buf, peek_msg, len);
-	    *recvd = (strlen(peek_msg) <= len ? strlen(peek_msg) : len);
+	    memcpy(buf, peek_msg, min(len,peek_msg_len+1));
+	    *recvd = min(len, peek_msg_len);
             return TRUE;
 	}
 	else if (peek_msg)
 	{
-	    strncpy(buf, peek_msg, len);
-	    peek_msg += *recvd = min(len, strlen(peek_msg));
+	    size_t peek_msg_len = strlen(peek_msg);
+	    memcpy(buf, peek_msg, min(len,peek_msg_len+1));
+	    peek_msg += *recvd = min(len, peek_msg_len);
 	    if (*peek_msg == '\0' || *(peek_msg - 1) == '\0')
 	    {
 		HeapFree(GetProcessHeap(), 0, peek_msg_mem);
@@ -383,7 +385,7 @@
 	    }
 	    else
 	    {
-		strncpy(peek_msg, buf, *recvd);
+		memcpy(peek_msg, buf, *recvd);
 		peek_msg[*recvd] = '\0';
 	    }
 	}






More information about the wine-patches mailing list