Liu Hao wrote:
...
Thanks for your extensive work. The patch looks mostly good.
Thanks. Meantime I found out that libssp.a actually provides
__mem*_chk() and __str*_chk(), so __builtin___*_chk() could be used
instead of manual checks. This makes string.h straightforward. This also
re-enables -Wstringop-overflow warnings which occur if overflow is known
at compile time (drawback: There is no __chk_fail() during runtime then).
I have a couple of questions:
0) What was the purpose of the suppression of `-Wformat-nonliteral`? It
seemed not added in every `v?sn?printf` function.
The new inline sn?printf() functions delegate the call to (non-v)
*_sn?printf() functions. This is not the case in the existing code.
The pragmas are not really necessary as warnings are normally suppressed
for system includes. I added these because there are already 'ignored
"-Wshadow"' in this file.
1) As for 'string.h', there is already an `extern "C"` block, so is it
necessary to declare a new one? Everything could have been in that
one which saves some lines.
Was needed because the sec_api/string_s.h was included in the middle and
I didn't want nested extern "C" blocks. No longer needed now.
2) Would you please add a wrapper for `memmove()` as well?
Of course, plus mempcpy(). New patch attached.
--
Regards,
Christian
diff --git a/include/_mingw_mac.h b/include/_mingw_mac.h
index c5d1a0d..3e88867 100644
--- a/include/_mingw_mac.h
+++ b/include/_mingw_mac.h
@@ -291,6 +291,37 @@
# define __mingw_static_ovr __mingw_ovr
#endif /* __cplusplus */
+#undef __mingw_va_arg_pack_ovr
+#if __MINGW_GNUC_PREREQ (4, 3) && !defined (__clang__)
+# define __mingw_va_arg_pack_ovr __mingw_ovr \
+ __attribute__((__always_inline__, __gnu_inline__))
+#endif
+
+#if _FORTIFY_SOURCE > 0 && __OPTIMIZE__ > 0 && __MINGW_GNUC_PREREQ (4, 3)
+# if _FORTIFY_SOURCE > 1
+# define __MINGW_FORTIFY_LEVEL 2
+# else
+# define __MINGW_FORTIFY_LEVEL 1
+# endif
+#else
+# define __MINGW_FORTIFY_LEVEL 0
+#endif
+
+#if __MINGW_FORTIFY_LEVEL > 0
+# define __mingw_bos_declare void __chk_fail() __attribute__((__noreturn__))
+# define __mingw_bos(p) __builtin_object_size((p), (__MINGW_FORTIFY_LEVEL >
1))
+# define __mingw_bos_known(p) (__mingw_bos(p) != (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_ovr __mingw_ovr \
+ __attribute__((__always_inline__, __gnu_inline__))
+# define __mingw_extern_bos_ovr extern __inline__ __cdecl \
+ __attribute__((__always_inline__, __gnu_inline__))
+#else
+# define __mingw_bos_ovr __mingw_ovr
+#endif /* __MINGW_FORTIFY_LEVEL > 0 */
+
/* Enable workaround for ABI incompatibility on affected platforms */
#ifndef WIDL_EXPLICIT_AGGREGATE_RETURNS
#if defined(__GNUC__) && defined(__cplusplus) && (defined(__x86_64__) ||
defined(__i386__))
diff --git a/include/stdio.h b/include/stdio.h
index e183236..aba2aa2 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -156,6 +156,10 @@ extern FILE (* __MINGW_IMP_SYMBOL(_iob))[]; /* A
pointer to an array of FILE */
#endif
#endif
+#if __MINGW_FORTIFY_LEVEL > 0
+__mingw_bos_declare;
+#endif
+
#ifndef _STDIO_DEFINED
extern
__attribute__((__format__ (gnu_scanf, 2, 3))) __MINGW_ATTRIB_NONNULL(2)
@@ -349,6 +353,28 @@ int printf (const char *__format, ...)
return __retval;
}
+#ifdef __mingw_va_arg_pack_ovr
+
+__mingw_va_arg_pack_ovr
+__attribute__((__format__ (gnu_printf, 2, 3))) __MINGW_ATTRIB_NONNULL(2)
+int sprintf (char *__stream, const char *__format, ...)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#if __MINGW_FORTIFY_LEVEL > 0
+ if (__mingw_bos_known(__stream)) {
+ int __retval = __mingw_snprintf( __stream, __mingw_bos(__stream),
__format, __builtin_va_arg_pack() );
+ if (__retval >= 0)
+ __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
+ return __retval;
+ }
+#endif
+ return __mingw_sprintf( __stream, __format, __builtin_va_arg_pack() );
+#pragma GCC diagnostic pop
+}
+
+#else /* !__mingw_va_arg_pack_ovr */
+
__mingw_ovr
__attribute__((__format__ (gnu_printf, 2, 3))) __MINGW_ATTRIB_NONNULL(2)
int sprintf (char *__stream, const char *__format, ...)
@@ -360,6 +386,8 @@ int sprintf (char *__stream, const char *__format, ...)
return __retval;
}
+#endif /* __mingw_va_arg_pack_ovr */
+
__mingw_ovr
__attribute__((__format__ (gnu_printf, 2, 0))) __MINGW_ATTRIB_NONNULL(2)
int vfprintf (FILE *__stream, const char *__format, __builtin_va_list
__local_argv)
@@ -374,13 +402,39 @@ int vprintf (const char *__format, __builtin_va_list
__local_argv)
return __mingw_vfprintf( stdout, __format, __local_argv );
}
-__mingw_ovr
+__mingw_bos_ovr
__attribute__((__format__ (gnu_printf, 2, 0))) __MINGW_ATTRIB_NONNULL(2)
int vsprintf (char *__stream, const char *__format, __builtin_va_list
__local_argv)
{
+#if __MINGW_FORTIFY_LEVEL > 0
+ if (__mingw_bos_known(__stream)) {
+ int __retval = __mingw_vsnprintf( __stream, __mingw_bos(__stream),
__format, __local_argv );
+ if (__retval >= 0)
+ __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
+ return __retval;
+ }
+#endif
return __mingw_vsprintf( __stream, __format, __local_argv );
}
/* #ifndef __NO_ISOCEXT */ /* externs in libmingwex.a */
+
+#ifdef __mingw_va_arg_pack_ovr
+
+__mingw_va_arg_pack_ovr
+__attribute__((__format__ (gnu_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
+int snprintf (char *__stream, size_t __n, const char *__format, ...)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#if __MINGW_FORTIFY_LEVEL > 0
+ __mingw_bos_ptr_chk(__stream, __n);
+#endif
+ return __mingw_snprintf( __stream, __n, __format, __builtin_va_arg_pack() );
+#pragma GCC diagnostic pop
+}
+
+#else /* !__mingw_va_arg_pack_ovr */
+
__mingw_ovr
__attribute__((__format__ (gnu_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
int snprintf (char *__stream, size_t __n, const char *__format, ...)
@@ -392,10 +446,15 @@ int snprintf (char *__stream, size_t __n, const char
*__format, ...)
return __retval;
}
-__mingw_ovr
+#endif /* __mingw_va_arg_pack_ovr */
+
+__mingw_bos_ovr
__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(__stream, __n);
+#endif
return __mingw_vsnprintf( __stream, __n, __format, __local_argv );
}
@@ -765,10 +824,13 @@ int vsnprintf (char *__stream, size_t __n, const char
*__format, __builtin_va_li
int __cdecl __ms_vsnprintf(char * __restrict__ d,size_t n,const char *
__restrict__ format,va_list arg)
__MINGW_ATTRIB_DEPRECATED_MSVC2005 __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
- __mingw_ovr
+ __mingw_bos_ovr
__attribute__((__format__ (ms_printf, 3, 0))) __MINGW_ATTRIB_NONNULL(3)
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(__stream, __n);
+#endif
return __ms_vsnprintf (__stream, __n, __format, __local_argv);
}
@@ -776,6 +838,23 @@ int vsnprintf (char *__stream, size_t __n, const char
*__format, __builtin_va_li
int __cdecl __ms_snprintf(char * __restrict__ s, size_t n, const char *
__restrict__ format, ...);
#ifndef __NO_ISOCEXT
+#ifdef __mingw_va_arg_pack_ovr
+
+__mingw_va_arg_pack_ovr
+__attribute__((__format__ (ms_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
+int snprintf (char * __restrict__ __stream, size_t __n, const char *
__restrict__ __format, ...)
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#if __MINGW_FORTIFY_LEVEL > 0
+ __mingw_bos_ptr_chk(__stream, __n);
+#endif
+ return __ms_snprintf(__stream, __n, __format, __builtin_va_arg_pack());
+#pragma GCC diagnostic pop
+}
+
+#else /* !__mingw_va_arg_pack_ovr */
+
__mingw_ovr
__attribute__((__format__ (ms_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
int snprintf (char * __restrict__ __stream, size_t __n, const char *
__restrict__ __format, ...)
@@ -786,6 +865,8 @@ int snprintf (char * __restrict__ __stream, size_t __n,
const char * __restrict_
__builtin_va_end( __local_argv );
return __retval;
}
+
+#endif /* !__mingw_va_arg_pack_ovr */
#endif /* !__NO_ISOCEXT */
#pragma pop_macro ("vsnprintf")
@@ -949,6 +1030,21 @@ int vwprintf (const wchar_t *__format, __builtin_va_list
__local_argv)
}
#ifndef __NO_ISOCEXT /* externs in libmingwex.a */
+
+#ifdef __mingw_va_arg_pack_ovr
+
+__mingw_va_arg_pack_ovr
+/* __attribute__((__format__ (gnu_wprintf, 3, 4))) */ __MINGW_ATTRIB_NONNULL(3)
+int snwprintf (wchar_t *__stream, size_t __n, const wchar_t *__format, ...)
+{
+#if __MINGW_FORTIFY_LEVEL > 0
+ __mingw_bos_ptr_chk(__stream, __n * sizeof(wchar_t));
+#endif
+ return __mingw_snwprintf( __stream, __n, __format, __builtin_va_arg_pack() );
+}
+
+#else /* !__mingw_va_arg_pack_ovr */
+
__mingw_ovr
/* __attribute__((__format__ (gnu_wprintf, 3, 4))) */ __MINGW_ATTRIB_NONNULL(3)
int snwprintf (wchar_t *__stream, size_t __n, const wchar_t *__format, ...)
@@ -960,10 +1056,15 @@ int snwprintf (wchar_t *__stream, size_t __n, const
wchar_t *__format, ...)
return __retval;
}
-__mingw_ovr
+#endif /* __mingw_va_arg_pack_ovr */
+
+__mingw_bos_ovr
/* __attribute__((__format__ (gnu_wprintf, 3, 0))) */ __MINGW_ATTRIB_NONNULL(3)
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(__stream, __n * sizeof(wchar_t));
+#endif
return __mingw_vsnwprintf( __stream, __n, __format, __local_argv );
}
#endif /* __NO_ISOCEXT */
diff --git a/include/string.h b/include/string.h
index c8c8018..f754818 100644
--- a/include/string.h
+++ b/include/string.h
@@ -183,6 +183,58 @@ extern "C" {
#endif
#endif
+#if __MINGW_FORTIFY_LEVEL > 0
+
+__mingw_extern_bos_ovr
+void * __cdecl memcpy(void * __restrict__ __dst, const void * __restrict__
__src, size_t __n)
+{
+ return __builtin___memcpy_chk(__dst, __src, __n, __mingw_bos(__dst));
+}
+
+__mingw_extern_bos_ovr
+void * __cdecl memset(void * __dst, int __val, size_t __n)
+{
+ return __builtin___memset_chk(__dst, __val, __n, __mingw_bos(__dst));
+}
+
+__mingw_extern_bos_ovr
+void * __cdecl memmove(void * __dst, const void * __src, size_t __n)
+{
+ return __builtin___memmove_chk(__dst, __src, __n, __mingw_bos(__dst));
+}
+
+__mingw_extern_bos_ovr
+void * __cdecl mempcpy(void * __dst, const void * __src, size_t __n)
+{
+ return __builtin___mempcpy_chk(__dst, __src, __n, __mingw_bos(__dst));
+}
+
+__mingw_extern_bos_ovr
+char * __cdecl strcpy(char * __restrict__ __dst, const char * __restrict__
__src)
+{
+ return __builtin___strcpy_chk(__dst, __src, __mingw_bos(__dst));
+}
+
+__mingw_extern_bos_ovr
+char * __cdecl strcat(char * __restrict__ __dst, const char * __restrict__
__src)
+{
+ return __builtin___strcat_chk(__dst, __src, __mingw_bos(__dst));
+}
+
+__mingw_extern_bos_ovr
+char * __cdecl strncpy(char * __restrict__ __dst, const char * __restrict__
__src, size_t __n)
+{
+ return __builtin___strncpy_chk(__dst, __src, __n, __mingw_bos(__dst));
+}
+
+__mingw_extern_bos_ovr
+char * __cdecl strncat(char * __restrict__ __dst, const char * __restrict__
__src, size_t __n)
+{
+ return __builtin___strncat_chk(__dst, __src, __n, __mingw_bos(__dst));
+}
+
+#endif /* __MINGW_FORTIFY_LEVEL > 0 */
+
#ifdef __cplusplus
}
#endif
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public