X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/224c70764cab4e0e39a26aaf3ad3016552f62f55..fc56b708803d28b949a9181528bb0da4d25b3b7b:/secure/sprintf_chk.c diff --git a/secure/sprintf_chk.c b/secure/sprintf_chk.c index 62a2a60..6163ce1 100644 --- a/secure/sprintf_chk.c +++ b/secure/sprintf_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@ * @@ -25,30 +25,48 @@ #include #include #include - -extern void __chk_fail (void) __attribute__((__noreturn__)); -extern int __sprintf_chk (char * __restrict, int, size_t, - const char * __restrict, ...) - __DARWIN_LDBL_COMPAT (__sprintf_chk); +#include "secure.h" int -__sprintf_chk (char *s, int flags, size_t len, const char *format, ...) +__sprintf_chk (char *dest, int flags, size_t dstlen, const char *format, ...) { va_list arg; int done; va_start (arg, format); - if (len > (size_t) INT_MAX) - done = vsprintf (s, format, arg); + if (__builtin_expect (dstlen > (size_t) INT_MAX, 0)) + done = vsprintf (dest, format, arg); else { - done = vsnprintf (s, len, format, arg); - if (done >= 0 && (size_t) done >= len) - __chk_fail (); + done = vsnprintf (dest, dstlen, format, arg); + if (__builtin_expect(done >= 0 && (size_t) done >= dstlen, 0)) + __chk_fail_overflow (); } va_end (arg); return done; } + +int +__sprintf_object_size_chk (char *dest, size_t dstlen, const char *format, ...) +{ + va_list arg; + int done; + + va_start (arg, format); + + if (__builtin_expect (dstlen > (size_t) INT_MAX, 0)) + done = vsprintf (dest, format, arg); + else + { + done = vsnprintf (dest, dstlen, format, arg); + if (__builtin_expect(done >= 0 && (size_t) done >= dstlen, 0)) + __chk_fail_overflow (); + } + + va_end (arg); + + return done; +}