-
Notifications
You must be signed in to change notification settings - Fork 41
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Some distributions are now setting -D_FORTIFY_SOURCE=3 by default in their toolchains rather than _F_S=2. By forcing _F_S=2, this causes both a warning and a downgrade in the effective protection. Use the autoconf-archive macro for this purpose (AX_ADD_FORTIFY_SOURCE) to add the fortification at the highest supported level if the compiler doesn't already default to it. Link: #103 Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
- Loading branch information
Showing
3 changed files
with
178 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
# =========================================================================== | ||
# https://www.gnu.org/software/autoconf-archive/ax_add_fortify_source.html | ||
# =========================================================================== | ||
# | ||
# SYNOPSIS | ||
# | ||
# AX_ADD_FORTIFY_SOURCE | ||
# | ||
# DESCRIPTION | ||
# | ||
# Check whether -D_FORTIFY_SOURCE=2 can be added to CPPFLAGS without macro | ||
# redefinition warnings, other cpp warnings or linker. Some distributions | ||
# (such as Ubuntu or Gentoo Linux) enable _FORTIFY_SOURCE globally in | ||
# their compilers, leading to unnecessary warnings in the form of | ||
# | ||
# <command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror] | ||
# <built-in>: note: this is the location of the previous definition | ||
# | ||
# which is a problem if -Werror is enabled. This macro checks whether | ||
# _FORTIFY_SOURCE is already defined, and if not, adds -D_FORTIFY_SOURCE=2 | ||
# to CPPFLAGS. | ||
# | ||
# Newer mingw-w64 msys2 package comes with a bug in | ||
# headers-git-7.0.0.5546.d200317d-1. It broke -D_FORTIFY_SOURCE support, | ||
# and would need -lssp or -fstack-protector. See | ||
# https://github.com/msys2/MINGW-packages/issues/5803. Try to actually | ||
# link it. | ||
# | ||
# LICENSE | ||
# | ||
# Copyright (c) 2017 David Seifert <soap@gentoo.org> | ||
# Copyright (c) 2019, 2023 Reini Urban <rurban@cpan.org> | ||
# | ||
# Copying and distribution of this file, with or without modification, are | ||
# permitted in any medium without royalty provided the copyright notice | ||
# and this notice are preserved. This file is offered as-is, without any | ||
# warranty. | ||
|
||
#serial 10 | ||
|
||
AC_DEFUN([AX_ADD_FORTIFY_SOURCE],[ | ||
ac_save_cflags=$CFLAGS | ||
ac_cwerror_flag=yes | ||
AX_CHECK_COMPILE_FLAG([-Werror],[CFLAGS="$CFLAGS -Werror"]) | ||
ax_add_fortify_3_failed= | ||
AC_MSG_CHECKING([whether to add -D_FORTIFY_SOURCE=3 to CPPFLAGS]) | ||
AC_LINK_IFELSE([ | ||
AC_LANG_PROGRAM([], | ||
[[ | ||
#ifndef _FORTIFY_SOURCE | ||
return 0; | ||
#else | ||
_FORTIFY_SOURCE_already_defined; | ||
#endif | ||
]] | ||
)], | ||
AC_LINK_IFELSE([ | ||
AC_LANG_SOURCE([[ | ||
#define _FORTIFY_SOURCE 3 | ||
#include <string.h> | ||
int main(void) { | ||
char *s = " "; | ||
strcpy(s, "x"); | ||
return strlen(s)-1; | ||
} | ||
]] | ||
)], | ||
[ | ||
AC_MSG_RESULT([yes]) | ||
CFLAGS=$ac_save_cflags | ||
CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=3" | ||
], [ | ||
AC_MSG_RESULT([no]) | ||
ax_add_fortify_3_failed=1 | ||
], | ||
), | ||
[ | ||
AC_MSG_RESULT([no]) | ||
ax_add_fortify_3_failed=1 | ||
]) | ||
if test -n "$ax_add_fortify_3_failed" | ||
then | ||
AC_MSG_CHECKING([whether to add -D_FORTIFY_SOURCE=2 to CPPFLAGS]) | ||
AC_LINK_IFELSE([ | ||
AC_LANG_PROGRAM([], | ||
[[ | ||
#ifndef _FORTIFY_SOURCE | ||
return 0; | ||
#else | ||
_FORTIFY_SOURCE_already_defined; | ||
#endif | ||
]] | ||
)], | ||
AC_LINK_IFELSE([ | ||
AC_LANG_SOURCE([[ | ||
#define _FORTIFY_SOURCE 2 | ||
#include <string.h> | ||
int main(void) { | ||
char *s = " "; | ||
strcpy(s, "x"); | ||
return strlen(s)-1; | ||
} | ||
]] | ||
)], | ||
[ | ||
AC_MSG_RESULT([yes]) | ||
CFLAGS=$ac_save_cflags | ||
CPPFLAGS="$CPPFLAGS -D_FORTIFY_SOURCE=2" | ||
], [ | ||
AC_MSG_RESULT([no]) | ||
CFLAGS=$ac_save_cflags | ||
], | ||
), | ||
[ | ||
AC_MSG_RESULT([no]) | ||
CFLAGS=$ac_save_cflags | ||
]) | ||
fi | ||
]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# =========================================================================== | ||
# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html | ||
# =========================================================================== | ||
# | ||
# SYNOPSIS | ||
# | ||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) | ||
# | ||
# DESCRIPTION | ||
# | ||
# Check whether the given FLAG works with the current language's compiler | ||
# or gives an error. (Warnings, however, are ignored) | ||
# | ||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on | ||
# success/failure. | ||
# | ||
# If EXTRA-FLAGS is defined, it is added to the current language's default | ||
# flags (e.g. CFLAGS) when the check is done. The check is thus made with | ||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to | ||
# force the compiler to issue an error when a bad flag is given. | ||
# | ||
# INPUT gives an alternative input source to AC_COMPILE_IFELSE. | ||
# | ||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this | ||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. | ||
# | ||
# LICENSE | ||
# | ||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> | ||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> | ||
# | ||
# Copying and distribution of this file, with or without modification, are | ||
# permitted in any medium without royalty provided the copyright notice | ||
# and this notice are preserved. This file is offered as-is, without any | ||
# warranty. | ||
|
||
#serial 6 | ||
|
||
AC_DEFUN([AX_CHECK_COMPILE_FLAG], | ||
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF | ||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl | ||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ | ||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS | ||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" | ||
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], | ||
[AS_VAR_SET(CACHEVAR,[yes])], | ||
[AS_VAR_SET(CACHEVAR,[no])]) | ||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) | ||
AS_VAR_IF(CACHEVAR,yes, | ||
[m4_default([$2], :)], | ||
[m4_default([$3], :)]) | ||
AS_VAR_POPDEF([CACHEVAR])dnl | ||
])dnl AX_CHECK_COMPILE_FLAGS |