diff --git a/acinclude.m4 b/acinclude.m4 index 626031c2895..48724f4f0b5 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1739,6 +1739,42 @@ choke me fi ]) +dnl +dnl PHP_BROKEN_GCC_STRLEN_OPT +dnl +dnl Early releases of GCC 8 shipped with a strlen() optimization bug, so they +dnl didn't properly handle the `char val[1]` struct hack. See bug #76510. +dnl +AC_DEFUN([PHP_BROKEN_GCC_STRLEN_OPT], [ + AC_CACHE_CHECK([for broken gcc optimize-strlen],ac_cv_have_broken_gcc_strlen_opt,[ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +struct s +{ + int i; + char c[1]; +}; +int main() +{ + struct s *s = malloc(sizeof(struct s) + 3); + s->i = 3; + strcpy(s->c, "foo"); + return strlen(s->c+1) == 2; +} +]])],[ + ac_cv_have_broken_gcc_strlen_opt=yes +],[ + ac_cv_have_broken_gcc_strlen_opt=no +],[ + ac_cv_have_broken_gcc_strlen_opt=no +])]) + if test "$ac_cv_have_broken_gcc_strlen_opt" = "yes"; then + CFLAGS="$CFLAGS -fno-optimize-strlen" + fi +]) + dnl dnl PHP_FOPENCOOKIE dnl diff --git a/configure.ac b/configure.ac index aa5456e8c56..b7e7a78e03a 100644 --- a/configure.ac +++ b/configure.ac @@ -500,6 +500,9 @@ immintrin.h PHP_FOPENCOOKIE PHP_BROKEN_GETCWD PHP_BROKEN_GLIBC_FOPEN_APPEND +if test "$GCC" = "yes"; then + PHP_BROKEN_GCC_STRLEN_OPT +fi dnl Checks for typedefs, structures, and compiler characteristics. dnl -------------------------------------------------------------------------