[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