Browse Source

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] <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86914>
pull/3510/head
Christoph M. Becker 7 years ago
parent
commit
b117feeb2b
  1. 1
      NEWS
  2. 36
      acinclude.m4
  3. 3
      configure.ac

1
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()

36
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 <stdlib.h>
#include <string.h>
#include <stdio.h>
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

3
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 -------------------------------------------------------------------------

Loading…
Cancel
Save