From: Jakub Jelinek Date: Mon, 18 Oct 2004 10:00:48 +0000 (+0000) Subject: * sysdeps/generic/strcpy_chk.c (__strcpy_chk): Speed up by checking X-Git-Tag: cvs/fedora-glibc-2_3_3-69~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c7dae119e405a26bc23c07820d76bab0fdb0af0;p=thirdparty%2Fglibc.git * sysdeps/generic/strcpy_chk.c (__strcpy_chk): Speed up by checking destlen only every 4 bytes. --- diff --git a/ChangeLog b/ChangeLog index 1e5ff7d9817..a282a288dba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-10-18 Jakub Jelinek + + * sysdeps/generic/strcpy_chk.c (__strcpy_chk): Speed up by checking + destlen only every 4 bytes. + 2004-10-06 Maciej W. Rozycki * sysdeps/unix/sysv/linux/mips/mips32/sysdep.h diff --git a/sysdeps/generic/strcpy_chk.c b/sysdeps/generic/strcpy_chk.c index 5c1ae44cd07..a4d909fedac 100644 --- a/sysdeps/generic/strcpy_chk.c +++ b/sysdeps/generic/strcpy_chk.c @@ -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');