diff options
Diffstat (limited to 'debug/strcpy_chk.c')
-rw-r--r-- | debug/strcpy_chk.c | 44 |
1 files changed, 5 insertions, 39 deletions
diff --git a/debug/strcpy_chk.c b/debug/strcpy_chk.c index 91bf0dd776..7cacbfe25f 100644 --- a/debug/strcpy_chk.c +++ b/debug/strcpy_chk.c @@ -23,45 +23,11 @@ /* Copy SRC to DEST with checking of destination buffer overflow. */ char * -__strcpy_chk (dest, src, destlen) - char *dest; - const char *src; - size_t destlen; +__strcpy_chk (char *dest, const char *src, size_t destlen) { - char c; - char *s = (char *) src; - const ptrdiff_t off = dest - s; + size_t len = strlen (src); + if (len >= destlen) + __chk_fail (); - 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 (__glibc_unlikely (destlen-- == 0)) - __chk_fail (); - c = *s; - *(s++ + off) = c; - } - while (c != '\0'); - - return dest; + return memcpy (dest, src, len + 1); } |