aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/include/ssp/ssp.h
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/include/ssp/ssp.h')
-rw-r--r--newlib/libc/include/ssp/ssp.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/newlib/libc/include/ssp/ssp.h b/newlib/libc/include/ssp/ssp.h
index 9229086..49ea5f2 100644
--- a/newlib/libc/include/ssp/ssp.h
+++ b/newlib/libc/include/ssp/ssp.h
@@ -43,11 +43,20 @@
#define __ssp_inline extern __inline__ __attribute__((__always_inline__, __gnu_inline__))
+#if __SSP_FORTIFY_LEVEL > 2
+#define __ssp_bos(ptr) __builtin_dynamic_object_size(ptr, 1)
+#define __ssp_bos0(ptr) __builtin_dynamic_object_size(ptr, 0)
+#define __ssp_bos_known(ptr) \
+ (__builtin_object_size(ptr, 0) != (size_t)-1 \
+ || !__builtin_constant_p(__ssp_bos(ptr)))
+#else
#define __ssp_bos(ptr) __builtin_object_size(ptr, __SSP_FORTIFY_LEVEL > 1)
#define __ssp_bos0(ptr) __builtin_object_size(ptr, 0)
+#define __ssp_bos_known(ptr) (__ssp_bos0(ptr) != (size_t)-1)
+#endif
#define __ssp_check(buf, len, bos) \
- if (bos(buf) != (size_t)-1 && len > bos(buf)) \
+ if (__ssp_bos_known(buf) && len > bos(buf)) \
__chk_fail()
#define __ssp_decl(rtype, fun, args) \
rtype __ssp_real_(fun) args __asm__(__ASMNAME(#fun)); \