silc_utf8_strncasecmp reads outside of buffer
Ray Lai
ray at cyth.net
Tue Aug 29 22:01:01 CEST 2006
silc_utf8_strncasecmp does a strlen(3) on strings with no regard to the
length even though it is given one. silc_client_nickname_format()
passes non-NUL-terminated strings to silc_utf8_strncasecmp(). This
leads to an overread and can crash silc.
This should fix the bug reported in:
http://lists.silcnet.org/pipermail/silc-devel/2005-November/001730.html
http://lists.silcnet.org/pipermail/silc-devel/2005-November/001731.html
-Ray-
--- silcutf8.c.orig Sun Apr 3 08:27:33 2005
+++ silcutf8.c Tue Aug 29 15:40:51 2006
@@ -565,15 +565,19 @@ bool silc_utf8_strncasecmp(const char *s
if (s1 == s2)
return TRUE;
+ s1u = memchr(s1, '\0', n);
+ s1u_len = (s1u == NULL) ? n : (s1u - (unsigned char *)s1);
/* Casefold and normalize */
- status = silc_stringprep(s1, strlen(s1), SILC_STRING_UTF8,
+ status = silc_stringprep(s1, s1u_len, SILC_STRING_UTF8,
SILC_IDENTIFIERC_PREP, 0, &s1u,
&s1u_len, SILC_STRING_UTF8);
if (status != SILC_STRINGPREP_OK)
return FALSE;
+ s2u = memchr(s2, '\0', n);
+ s2u_len = (s2u == NULL) ? n : (s2u - (unsigned char *)s2);
/* Casefold and normalize */
- status = silc_stringprep(s2, strlen(s2), SILC_STRING_UTF8,
+ status = silc_stringprep(s2, s2u_len, SILC_STRING_UTF8,
SILC_IDENTIFIERC_PREP, 0, &s2u,
&s2u_len, SILC_STRING_UTF8);
if (status != SILC_STRINGPREP_OK)
More information about the silc-devel
mailing list