Kaynağa Gözat

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.
Rich Felker 14 yıl önce
ebeveyn
işleme
c68b26369e
1 değiştirilmiş dosya ile 11 ekleme ve 9 silme
  1. 11 9
      src/string/strchr.c

+ 11 - 9
src/string/strchr.c

@@ -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;
 }