summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/assert/expect_empty_stmt_bug.phpt11
-rw-r--r--Zend/zend_ast.c4
-rw-r--r--Zend/zend_compile.c4
-rw-r--r--Zend/zend_portability.h6
-rw-r--r--ext/standard/php_string.h2
-rw-r--r--main/php.h6
6 files changed, 25 insertions, 8 deletions
diff --git a/Zend/tests/assert/expect_empty_stmt_bug.phpt b/Zend/tests/assert/expect_empty_stmt_bug.phpt
new file mode 100644
index 0000000000..f5dcff3ba5
--- /dev/null
+++ b/Zend/tests/assert/expect_empty_stmt_bug.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Empty statement in assert() shouldn't segfault
+--FILE--
+<?php
+
+assert((function () { return true;; })());
+echo "ok";
+
+?>
+--EXPECT--
+ok
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index 714a1443b0..d36ce0b2ad 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -783,6 +783,10 @@ static void zend_ast_export_var_list(smart_str *str, zend_ast_list *list, int in
static void zend_ast_export_stmt(smart_str *str, zend_ast *ast, int indent)
{
+ if (!ast) {
+ return;
+ }
+
if (ast->kind == ZEND_AST_STMT_LIST ||
ast->kind == ZEND_AST_TRAIT_ADAPTATIONS) {
zend_ast_list *list = (zend_ast_list*)ast;
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 4cf2a57f75..f63c9f3700 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -5667,9 +5667,9 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
if (strcmp(ZSTR_VAL(dirname), ".") == 0) {
dirname = zend_string_extend(dirname, MAXPATHLEN, 0);
#if HAVE_GETCWD
- VCWD_GETCWD(ZSTR_VAL(dirname), MAXPATHLEN);
+ ZEND_IGNORE_VALUE(VCWD_GETCWD(ZSTR_VAL(dirname), MAXPATHLEN));
#elif HAVE_GETWD
- VCWD_GETWD(ZSTR_VAL(dirname));
+ ZEND_IGNORE_VALUE(VCWD_GETWD(ZSTR_VAL(dirname)));
#endif
}
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index 214ece53e6..42a70b9c0b 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -117,6 +117,12 @@
# define EMPTY_SWITCH_DEFAULT_CASE() default: ZEND_ASSUME(0); break;
#endif
+#if defined(__GNUC__) && __GNUC__ >= 4
+# define ZEND_IGNORE_VALUE(x) (({ __typeof__ (x) __x = (x); (void) __x; }))
+#else
+# define ZEND_IGNORE_VALUE(x) ((void) (x))
+#endif
+
/* all HAVE_XXX test have to be after the include of zend_config above */
#if defined(HAVE_LIBDL) && !defined(ZEND_WIN32)
diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h
index 8390bd79fe..6f10e9a313 100644
--- a/ext/standard/php_string.h
+++ b/ext/standard/php_string.h
@@ -161,7 +161,7 @@ PHPAPI char *php_strerror(int errnum);
# define php_mb_reset() memset(&BG(mblen_state), 0, sizeof(BG(mblen_state)))
#else
# define php_mblen(ptr, len) mblen(ptr, len)
-# define php_mb_reset() mblen(NULL, 0)
+# define php_mb_reset() php_ignore_value(mblen(NULL, 0))
#endif
void register_string_constants(INIT_FUNC_ARGS);
diff --git a/main/php.h b/main/php.h
index 1d2c2dc099..3ebaa1a0b9 100644
--- a/main/php.h
+++ b/main/php.h
@@ -257,11 +257,7 @@ END_EXTERN_C()
# endif
#endif
-#if defined(__GNUC__) && __GNUC__ >= 4
-# define php_ignore_value(x) (({ __typeof__ (x) __x = (x); (void) __x; }))
-#else
-# define php_ignore_value(x) ((void) (x))
-#endif
+#define php_ignore_value(x) ZEND_IGNORE_VALUE(x)
/* global variables */
#if !defined(PHP_WIN32)