mirror of git://git.musl-libc.org/musl
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:
parent
2155afd73e
commit
c68b26369e
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue