/*
- * Copyright (c) 2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2007-2013 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
#include <stdio.h>
#include <stdarg.h>
#include <limits.h>
-
-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;
+}