X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/224c70764cab4e0e39a26aaf3ad3016552f62f55..refs/heads/master:/secure/strncpy_chk.c?ds=inline diff --git a/secure/strncpy_chk.c b/secure/strncpy_chk.c index df4420d..e8f7005 100644 --- a/secure/strncpy_chk.c +++ b/secure/strncpy_chk.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007 Apple Inc. All rights reserved. + * Copyright (c) 2007-2013 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -23,15 +23,26 @@ #include #include +#include "secure.h" -extern void __chk_fail (void) __attribute__((__noreturn__)); - -void * +char * __strncpy_chk (char *restrict dest, char *restrict src, size_t len, size_t dstlen) { + size_t n; + if (__builtin_expect (dstlen < len, 0)) - __chk_fail (); + __chk_fail_overflow (); + + // stpncpy normally returns a pointer to the \0 + n = stpncpy (dest, src, len) - dest + 1; + + // Check if it's pointing to the location after the buffer after not writing \0 + if (n == len + 1) + n--; + + if (__builtin_expect (__chk_assert_no_overlap != 0, 1)) + __chk_overlap(dest, n, src, n); - return strncpy (dest, src, len); + return dest; }