]> git.saurik.com Git - apple/libc.git/blobdiff - secure/sprintf_chk.c
Libc-1353.100.2.tar.gz
[apple/libc.git] / secure / sprintf_chk.c
index 62a2a60bdef6e83035628998475bc005174cf8cc..6163ce1c778e1d9b39ad3cb96810febc0dc2bb27 100644 (file)
@@ -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@
  *
 #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;
+}