fix serious bug in strchr - char signedness

search for bytes with high bit set was giving (potentially dangerous)
wrong results. i've tested, cleaned up, and hopefully sped up this
function now.
This commit is contained in:
Rich Felker 2011-04-03 18:16:11 -04:00
parent 2155afd73e
commit c68b26369e
1 changed files with 11 additions and 9 deletions

View File

@ -10,14 +10,16 @@
char *strchr(const char *s, int c)
{
c = (char)c;
size_t *w, k;
c = (unsigned char)c;
if (!c) return (char *)s + strlen(s);
for (; ((uintptr_t)s & ALIGN) && *s && *s != c; s++);
if (*s && *s != c) {
const size_t *w;
size_t k = ONES * c;
for (w = (const void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++);
for (s = (const void *)w; *s && *s != c; s++);
}
return *s ? (char *)s : 0;
for (; ((uintptr_t)s & ALIGN) && *s; s++)
if (*(unsigned char *)s == c) return (char *)s;
k = ONES * c;
for (w = (void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++);
for (s = (void *)w; *s; s++)
if (*(unsigned char *)s == c) return (char *)s;
return 0;
}