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
