summaryrefslogtreecommitdiff
path: root/acinclude.m4
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2018-09-11 12:23:20 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2018-09-11 12:23:20 +0200
commitb117feeb2b545b34296f2fc492166d790610fffe (patch)
tree6d1ba7307fad5eaea0f2f13829feb9b0b7b2fe71 /acinclude.m4
parent1bb29a4af22bb11c4257e475c691c3a75b5859a3 (diff)
downloadphp-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.m436
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], [