diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2018-09-11 12:23:20 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2018-09-11 12:23:20 +0200 |
commit | b117feeb2b545b34296f2fc492166d790610fffe (patch) | |
tree | 6d1ba7307fad5eaea0f2f13829feb9b0b7b2fe71 /acinclude.m4 | |
parent | 1bb29a4af22bb11c4257e475c691c3a75b5859a3 (diff) | |
download | php-git-b117feeb2b545b34296f2fc492166d790610fffe.tar.gz |
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>
Diffstat (limited to 'acinclude.m4')
-rw-r--r-- | acinclude.m4 | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/acinclude.m4 b/acinclude.m4 index 1deb50d298..c2ae195f9c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1740,6 +1740,42 @@ choke me ]) 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 AC_DEFUN([PHP_FOPENCOOKIE], [ |