]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Tue, 19 Oct 2004 21:21:42 +0000 (21:21 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 19 Oct 2004 21:21:42 +0000 (21:21 +0000)
2004-10-18  Jakub Jelinek  <jakub@redhat.com>

* sysdeps/generic/strcpy_chk.c (__strcpy_chk): Speed up by checking
destlen only every 4 bytes.

ChangeLog
sysdeps/generic/strcpy_chk.c

index 4594957ab9f744ede813df5dc12c73c47cb78183..f57da5f16e2a9d62fa29ff2032f57d570ca1bc7a 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-19  Ulrich Drepper  <drepper@redhat.com>
 
        * nss/getent.c (hosts_keys): Let inet_pton decide whether the
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');