This patch has no effect on generated code. See [PATCH 2/2] for use case.

From e7a3778a0db64fb6b9ba0bac8a225a73f45e9529 Mon Sep 17 00:00:00 2001
From: Christian Franke <[email protected]>
Date: Wed, 9 Oct 2019 21:28:17 +0200
Subject: [PATCH 1/2] headers: _FORTIFY_SOURCE: Allow to limit level for
 individual functions.

Add parameter 'maxtype' to __mingw_bos*() macros.  Allows to force usage
of __builtin_object_size(p, 0) even if _FORTIFY_SOURCE=2 is set.
---
 mingw-w64-headers/crt/_mingw_mac.h | 16 ++++++-------
 mingw-w64-headers/crt/io.h         |  2 +-
 mingw-w64-headers/crt/stdio.h      | 36 +++++++++++++++---------------
 mingw-w64-headers/crt/string.h     | 22 +++++++++---------
 4 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/mingw-w64-headers/crt/_mingw_mac.h 
b/mingw-w64-headers/crt/_mingw_mac.h
index e380e265..213daa65 100644
--- a/mingw-w64-headers/crt/_mingw_mac.h
+++ b/mingw-w64-headers/crt/_mingw_mac.h
@@ -320,17 +320,17 @@
      void __cdecl __mingw_chk_fail_warn(void) __MINGW_ASM_CALL(__chk_fail) \
      __attribute__((__noreturn__)) \
      __attribute__((__warning__("Buffer overflow detected")))
-#  define __mingw_bos(p) \
-     __builtin_object_size((p), (__MINGW_FORTIFY_LEVEL > 1))
+#  define __mingw_bos(p, maxtype) \
+     __builtin_object_size((p), ((maxtype) > 0) && (__MINGW_FORTIFY_LEVEL > 1))
 #  define __mingw_bos_known(p) \
-     (__mingw_bos(p) != (size_t)-1)
+     (__mingw_bos(p, 0) != (size_t)-1)
 #  define __mingw_bos_cond_chk(c) \
      (__builtin_expect((c), 1) ? (void)0 : __chk_fail())
-#  define __mingw_bos_ptr_chk(p, n) \
-     __mingw_bos_cond_chk(!__mingw_bos_known(p) || __mingw_bos(p) >= 
(size_t)(n))
-#  define __mingw_bos_ptr_chk_warn(p, n) \
-     (__mingw_bos_known(p) && __builtin_constant_p((n)) && __mingw_bos(p) < 
(size_t)(n) \
-     ? __mingw_chk_fail_warn() : __mingw_bos_ptr_chk(p, n))
+#  define __mingw_bos_ptr_chk(p, n, maxtype) \
+     __mingw_bos_cond_chk(!__mingw_bos_known(p) || __mingw_bos(p, maxtype) >= 
(size_t)(n))
+#  define __mingw_bos_ptr_chk_warn(p, n, maxtype) \
+     (__mingw_bos_known(p) && __builtin_constant_p((n)) && __mingw_bos(p, 
maxtype) < (size_t)(n) \
+     ? __mingw_chk_fail_warn() : __mingw_bos_ptr_chk(p, n, maxtype))
 #  define __mingw_bos_ovr __mingw_ovr \
      __attribute__((__always_inline__)) \
      __mingw_attribute_artificial
diff --git a/mingw-w64-headers/crt/io.h b/mingw-w64-headers/crt/io.h
index fa486499..a36d1f0a 100644
--- a/mingw-w64-headers/crt/io.h
+++ b/mingw-w64-headers/crt/io.h
@@ -377,7 +377,7 @@ _CRTIMP int __cdecl __mingw_call__read(int, void *, 
unsigned int) __MINGW_ASM_CR
 __mingw_bos_extern_ovr
 int _read(int __fh, void * __dst, unsigned int __n)
 {
-  __mingw_bos_ptr_chk_warn(__dst, __n);
+  __mingw_bos_ptr_chk_warn(__dst, __n, 1);
   return __mingw_call__read(__fh, __dst, __n);
 }
 
diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h
index d6289eba..9446db60 100644
--- a/mingw-w64-headers/crt/stdio.h
+++ b/mingw-w64-headers/crt/stdio.h
@@ -361,9 +361,9 @@ __attribute__((__format__ (gnu_printf, 2, 3))) 
__MINGW_ATTRIB_NONNULL(2)
 int sprintf (char *__stream, const char *__format, ...)
 {
   if (__mingw_bos_known(__stream)) {
-    int __retval = __mingw_snprintf( __stream, __mingw_bos(__stream), 
__format, __builtin_va_arg_pack() );
+    int __retval = __mingw_snprintf( __stream, __mingw_bos(__stream, 1), 
__format, __builtin_va_arg_pack() );
     if (__retval >= 0)
-      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
+      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1, 1);
     return __retval;
   }
   return __mingw_sprintf( __stream, __format, __builtin_va_arg_pack() );
@@ -404,9 +404,9 @@ int vsprintf (char *__stream, const char *__format, 
__builtin_va_list __local_ar
 {
 #if __MINGW_FORTIFY_LEVEL > 0
   if (__mingw_bos_known(__stream)) {
-    int __retval = __mingw_vsnprintf( __stream, __mingw_bos(__stream), 
__format, __local_argv );
+    int __retval = __mingw_vsnprintf( __stream, __mingw_bos(__stream, 1), 
__format, __local_argv );
     if (__retval >= 0)
-      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
+      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1, 1);
     return __retval;
   }
 #endif
@@ -420,7 +420,7 @@ __mingw_bos_ovr
 __attribute__((__format__ (gnu_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
 int snprintf (char *__stream, size_t __n, const char *__format, ...)
 {
-  __mingw_bos_ptr_chk_warn(__stream, __n);
+  __mingw_bos_ptr_chk_warn(__stream, __n, 1);
   return __mingw_snprintf( __stream, __n, __format, __builtin_va_arg_pack() );
 }
 
@@ -444,7 +444,7 @@ __attribute__((__format__ (gnu_printf, 3, 0))) 
__MINGW_ATTRIB_NONNULL(3)
 int vsnprintf (char *__stream, size_t __n, const char *__format, 
__builtin_va_list __local_argv)
 {
 #if __MINGW_FORTIFY_LEVEL > 0
-  __mingw_bos_ptr_chk_warn(__stream, __n);
+  __mingw_bos_ptr_chk_warn(__stream, __n, 1);
 #endif
   return __mingw_vsnprintf( __stream, __n, __format, __local_argv );
 }
@@ -795,28 +795,28 @@ __mingw_bos_extern_ovr
 char * gets(char * __dst)
 {
   if (__mingw_bos_known(__dst))
-    return __gets_chk(__dst, __mingw_bos(__dst));
+    return __gets_chk(__dst, __mingw_bos(__dst, 1));
   return __mingw_call_gets_warn(__dst);
 }
 
 __mingw_bos_extern_ovr
 char * fgets(char * __restrict__ __dst, int __n, FILE * __restrict__ __f)
 {
-  __mingw_bos_ptr_chk_warn(__dst, __n);
+  __mingw_bos_ptr_chk_warn(__dst, __n, 1);
   return __mingw_call_fgets(__dst, __n, __f);
 }
 
 __mingw_bos_extern_ovr
 size_t fread(void * __restrict__ __dst, size_t __sz, size_t __n, FILE * 
__restrict__ __f)
 {
-  __mingw_bos_ptr_chk_warn(__dst, __sz * __n);
+  __mingw_bos_ptr_chk_warn(__dst, __sz * __n, 1);
   return __mingw_call_fread(__dst, __sz, __n, __f);
 }
 
 __mingw_bos_extern_ovr
 char * tmpnam(char * __dst)
 {
-  __mingw_bos_ptr_chk_warn(__dst, L_tmpnam);
+  __mingw_bos_ptr_chk_warn(__dst, L_tmpnam, 1);
   return __mingw_call_tmpnam(__dst);
 }
 
@@ -860,7 +860,7 @@ char * tmpnam(char * __dst)
   int vsnprintf (char * __restrict__ __stream, size_t __n, const char * 
__restrict__ __format, va_list __local_argv)
   {
 #if __MINGW_FORTIFY_LEVEL > 0
-    __mingw_bos_ptr_chk_warn(__stream, __n);
+    __mingw_bos_ptr_chk_warn(__stream, __n, 1);
 #endif
     return __ms_vsnprintf (__stream, __n, __format, __local_argv);
   }
@@ -875,7 +875,7 @@ __mingw_bos_ovr
 __attribute__((__format__ (ms_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
 int snprintf (char * __restrict__ __stream, size_t __n, const char * 
__restrict__ __format, ...)
 {
-  __mingw_bos_ptr_chk_warn(__stream, __n);
+  __mingw_bos_ptr_chk_warn(__stream, __n, 1);
   return __ms_snprintf(__stream, __n, __format, __builtin_va_arg_pack());
 }
 
@@ -904,9 +904,9 @@ __attribute__((__format__ (ms_printf, 2, 3))) 
__MINGW_ATTRIB_NONNULL(2)
 int sprintf (char * __restrict__ __stream, const char * __restrict__ __format, 
...)
 {
   if (__mingw_bos_known(__stream)) {
-    int __retval = __ms_snprintf( __stream, __mingw_bos(__stream), __format, 
__builtin_va_arg_pack() );
+    int __retval = __ms_snprintf( __stream, __mingw_bos(__stream, 1), 
__format, __builtin_va_arg_pack() );
     if (__retval >= 0)
-      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
+      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1, 1);
     return __retval;
   }
   return __mingw_call_ms_sprintf( __stream, __format, __builtin_va_arg_pack() 
);
@@ -923,9 +923,9 @@ __attribute__((__format__ (ms_printf, 2, 0))) 
__MINGW_ATTRIB_NONNULL(2)
 int vsprintf (char * __restrict__ __stream, const char * __restrict__ 
__format, va_list __local_argv)
 {
   if (__mingw_bos_known(__stream)) {
-    int __retval = __ms_vsnprintf( __stream, __mingw_bos(__stream), __format, 
__local_argv );
+    int __retval = __ms_vsnprintf( __stream, __mingw_bos(__stream, 1), 
__format, __local_argv );
     if (__retval >= 0)
-      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
+      __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1, 1);
     return __retval;
   }
   return __mingw_call_ms_vsprintf( __stream, __format, __local_argv );
@@ -1101,7 +1101,7 @@ __mingw_bos_ovr
 /* __attribute__((__format__ (gnu_wprintf, 3, 4))) */ __MINGW_ATTRIB_NONNULL(3)
 int snwprintf (wchar_t *__stream, size_t __n, const wchar_t *__format, ...)
 {
-  __mingw_bos_ptr_chk_warn(__stream, __n * sizeof(wchar_t));
+  __mingw_bos_ptr_chk_warn(__stream, __n * sizeof(wchar_t), 1);
   return __mingw_snwprintf( __stream, __n, __format, __builtin_va_arg_pack() );
 }
 
@@ -1125,7 +1125,7 @@ __mingw_bos_ovr
 int vsnwprintf (wchar_t *__stream, size_t __n, const wchar_t *__format, 
__builtin_va_list __local_argv)
 {
 #if __MINGW_FORTIFY_LEVEL > 0
-  __mingw_bos_ptr_chk_warn(__stream, __n * sizeof(wchar_t));
+  __mingw_bos_ptr_chk_warn(__stream, __n * sizeof(wchar_t), 1);
 #endif
   return __mingw_vsnwprintf( __stream, __n, __format, __local_argv );
 }
diff --git a/mingw-w64-headers/crt/string.h b/mingw-w64-headers/crt/string.h
index 3fe4866d..1189ba23 100644
--- a/mingw-w64-headers/crt/string.h
+++ b/mingw-w64-headers/crt/string.h
@@ -199,51 +199,51 @@ __mingw_bos_declare;
 __mingw_bos_extern_ovr
 void * memcpy(void * __restrict__ __dst, const void * __restrict__ __src, 
size_t __n)
 {
-  return __builtin___memcpy_chk(__dst, __src, __n, __mingw_bos(__dst));
+  return __builtin___memcpy_chk(__dst, __src, __n, __mingw_bos(__dst, 1));
 }
 
 __mingw_bos_extern_ovr
 void * memset(void * __dst, int __val, size_t __n)
 {
-  return __builtin___memset_chk(__dst, __val, __n, __mingw_bos(__dst));
+  return __builtin___memset_chk(__dst, __val, __n, __mingw_bos(__dst, 1));
 }
 
 __mingw_bos_extern_ovr
 void * memmove(void * __dst, const void * __src, size_t __n)
 {
-  return __builtin___memmove_chk(__dst, __src, __n, __mingw_bos(__dst));
+  return __builtin___memmove_chk(__dst, __src, __n, __mingw_bos(__dst, 1));
 }
 
 #ifdef _GNU_SOURCE
 __mingw_bos_extern_ovr
 void * mempcpy(void * __dst, const void * __src, size_t __n)
 {
-  return __builtin___mempcpy_chk(__dst, __src, __n, __mingw_bos(__dst));
+  return __builtin___mempcpy_chk(__dst, __src, __n, __mingw_bos(__dst, 1));
 }
 #endif /* _GNU_SOURCE */
 
 __mingw_bos_extern_ovr
 char * strcpy(char * __restrict__ __dst, const char * __restrict__ __src)
 {
-  return __builtin___strcpy_chk(__dst, __src, __mingw_bos(__dst));
+  return __builtin___strcpy_chk(__dst, __src, __mingw_bos(__dst, 1));
 }
 
 __mingw_bos_extern_ovr
 char * strcat(char * __restrict__ __dst, const char * __restrict__ __src)
 {
-  return __builtin___strcat_chk(__dst, __src, __mingw_bos(__dst));
+  return __builtin___strcat_chk(__dst, __src, __mingw_bos(__dst, 1));
 }
 
 __mingw_bos_extern_ovr
 char * strncpy(char * __restrict__ __dst, const char * __restrict__ __src, 
size_t __n)
 {
-  return __builtin___strncpy_chk(__dst, __src, __n, __mingw_bos(__dst));
+  return __builtin___strncpy_chk(__dst, __src, __n, __mingw_bos(__dst, 1));
 }
 
 __mingw_bos_extern_ovr
 char * strncat(char * __restrict__ __dst, const char * __restrict__ __src, 
size_t __n)
 {
-  return __builtin___strncat_chk(__dst, __src, __n, __mingw_bos(__dst));
+  return __builtin___strncat_chk(__dst, __src, __n, __mingw_bos(__dst, 1));
 }
 
 _SECIMP errno_t __cdecl __mingw_call_memcpy_s(void *, size_t, const void *, 
size_t) __MINGW_ASM_CRT_CALL(memcpy_s);
@@ -253,7 +253,7 @@ wchar_t * __cdecl __mingw_call_wcscat(wchar_t * 
__restrict__, const wchar_t * __
 __mingw_bos_extern_ovr
 errno_t memcpy_s(void * __dst, size_t __os, const void * __src, size_t __n)
 {
-  __mingw_bos_ptr_chk_warn(__dst, __os);
+  __mingw_bos_ptr_chk_warn(__dst, __os, 1);
   return __mingw_call_memcpy_s(__dst, __os, __src, __n);
 }
 
@@ -261,7 +261,7 @@ __mingw_bos_extern_ovr
 wchar_t * wcscpy(wchar_t * __restrict__ __dst, const wchar_t * __restrict__ 
__src)
 {
   if (__mingw_bos_known(__dst)) {
-    __mingw_bos_cond_chk(!wcscpy_s(__dst, __mingw_bos(__dst) / 
sizeof(wchar_t), __src));
+    __mingw_bos_cond_chk(!wcscpy_s(__dst, __mingw_bos(__dst, 1) / 
sizeof(wchar_t), __src));
     return __dst;
   }
   return __mingw_call_wcscpy(__dst, __src);
@@ -271,7 +271,7 @@ __mingw_bos_extern_ovr
 wchar_t * wcscat(wchar_t * __restrict__ __dst, const wchar_t * __restrict__ 
__src)
 {
   if (__mingw_bos_known(__dst)) {
-    __mingw_bos_cond_chk(!wcscat_s(__dst, __mingw_bos(__dst) / 
sizeof(wchar_t), __src));
+    __mingw_bos_cond_chk(!wcscat_s(__dst, __mingw_bos(__dst, 1) / 
sizeof(wchar_t), __src));
     return __dst;
   }
   return __mingw_call_wcscat(__dst, __src);
-- 
2.21.0

_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to