From b117feeb2b545b34296f2fc492166d790610fffe Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 11 Sep 2018 12:23:20 +0200 Subject: [PATCH] Fix #76510: file_exists() stopped working for phar:// We work around a strlen() optimization bug in GCC 8[1] by checking whether the used GCC exhibits the broken behavior, and if so by disabling `optimize-strlen`. [1] --- NEWS | 1 + acinclude.m4 | 36 ++++++++++++++++++++++++++++++++++++ configure.ac | 3 +++ 3 files changed, 40 insertions(+) diff --git a/NEWS b/NEWS index e85a3ef2d59..0d8c4d69f0c 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ PHP NEWS - Core: . Fixed bug #76825 (Undefined symbols ___cpuid_count). (Laruence) . Fixed bug #76820 (Z_COPYABLE invalid definition). (mvdwerve, cmb) + . Fixed bug #76510 (file_exists() stopped working for phar://). (cmb) - intl: . Fixed bug #76829 (Incorrect validation of domain on idn_to_utf8() diff --git a/acinclude.m4 b/acinclude.m4 index 1deb50d2983..c2ae195f9c2 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 78a1878c25d..dafe25e529a 100644 --- a/configure.ac +++ b/configure.ac @@ -503,6 +503,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 -------------------------------------------------------------------------