]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* sysdeps/generic/strcpy_chk.c (__strcpy_chk): Speed up by checking
authorJakub Jelinek <jakub@redhat.com>
Mon, 18 Oct 2004 10:00:48 +0000 (10:00 +0000)
committerJakub Jelinek <jakub@redhat.com>
Mon, 18 Oct 2004 10:00:48 +0000 (10:00 +0000)
destlen only every 4 bytes.

ChangeLog
sysdeps/generic/strcpy_chk.c

index 1e5ff7d981720675a71115499b4066121d122b6c..a282a288dbade57b0bcd429b5f71cf25641fae70 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-18  Jakub Jelinek  <jakub@redhat.com>
+
+       * sysdeps/generic/strcpy_chk.c (__strcpy_chk): Speed up by checking
+       destlen only every 4 bytes.
+
 2004-10-06  Maciej W. Rozycki  <macro@mips.com>
 
        * sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
index 5c1ae44cd078329b9ba42ce3ed80719864012aca..a4d909fedac07c8c973ac1f177ef050230ddf7da 100644 (file)
@@ -31,14 +31,36 @@ __strcpy_chk (dest, src, destlen)
 {
   reg_char c;
   char *s = (char *) src;
-  const ptrdiff_t off = dest - s - 1;
+  const ptrdiff_t off = dest - s;
+
+  while (__builtin_expect (destlen >= 4, 0))
+    {
+      c = s[0];
+      s[off] = c;
+      if (c == '\0')
+        return dest;
+      c = s[1];
+      s[off + 1] = c;
+      if (c == '\0')
+        return dest;
+      c = s[2];
+      s[off + 2] = c;
+      if (c == '\0')
+        return dest;
+      c = s[3];
+      s[off + 3] = c;
+      if (c == '\0')
+        return dest;
+      destlen -= 4;
+      s += 4;
+    }
 
   do
     {
       if (__builtin_expect (destlen-- == 0, 0))
-       __chk_fail ();
-      c = *s++;
-      s[off] = c;
+        __chk_fail ();
+      c = *s;
+      *(s++ + off) = c;
     }
   while (c != '\0');