- update to 5.5.8
- drop conflicts with other opcode caches as both can be used only for user data cache
This commit is contained in:
parent
3807d63350
commit
7fd8630211
1
.gitignore
vendored
1
.gitignore
vendored
@ -19,3 +19,4 @@ php-5.4.*.bz2
|
|||||||
/php-5.5.5-strip.tar.xz
|
/php-5.5.5-strip.tar.xz
|
||||||
/php-5.5.6-strip.tar.xz
|
/php-5.5.6-strip.tar.xz
|
||||||
/php-5.5.7-strip.tar.xz
|
/php-5.5.7-strip.tar.xz
|
||||||
|
/php-5.5.8-strip.tar.xz
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
From 12fe4e90be7bfa2a763197079f68f5568a14e071 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Remi Collet <remi@php.net>
|
|
||||||
Date: Wed, 27 Nov 2013 11:13:16 +0100
|
|
||||||
Subject: [PATCH] Fixed bug #66060 (Heap buffer over-read in DateInterval)
|
|
||||||
|
|
||||||
---
|
|
||||||
NEWS | 3 +++
|
|
||||||
ext/date/lib/parse_iso_intervals.c | 4 ++--
|
|
||||||
ext/date/lib/parse_iso_intervals.re | 2 +-
|
|
||||||
3 files changed, 6 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c
|
|
||||||
index bd1ad05..480ea38 100644
|
|
||||||
--- a/ext/date/lib/parse_iso_intervals.c
|
|
||||||
+++ b/ext/date/lib/parse_iso_intervals.c
|
|
||||||
@@ -380,7 +380,7 @@ yy6:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ptr++;
|
|
||||||
- } while (*ptr);
|
|
||||||
+ } while (!s->errors->error_count && *ptr);
|
|
||||||
s->have_period = 1;
|
|
||||||
TIMELIB_DEINIT;
|
|
||||||
return TIMELIB_PERIOD;
|
|
||||||
diff --git a/ext/date/lib/parse_iso_intervals.re b/ext/date/lib/parse_iso_intervals.re
|
|
||||||
index 56aa34d..c5e9f67 100644
|
|
||||||
--- a/ext/date/lib/parse_iso_intervals.re
|
|
||||||
+++ b/ext/date/lib/parse_iso_intervals.re
|
|
||||||
@@ -348,7 +348,7 @@ isoweek = year4 "-"? "W" weekofyear;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ptr++;
|
|
||||||
- } while (*ptr);
|
|
||||||
+ } while (!s->errors->error_count && *ptr);
|
|
||||||
s->have_period = 1;
|
|
||||||
TIMELIB_DEINIT;
|
|
||||||
return TIMELIB_PERIOD;
|
|
||||||
--
|
|
||||||
1.8.4.3
|
|
||||||
|
|
@ -1,251 +0,0 @@
|
|||||||
From 3e963f8eb44863ef3d758eabe791190b0fd7bb9a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Remi Collet <remi@php.net>
|
|
||||||
Date: Tue, 10 Dec 2013 16:07:16 +0100
|
|
||||||
Subject: [PATCH] Fixed Bug #66218 zend_register_functions breaks reflection
|
|
||||||
|
|
||||||
Functions registered using zend_register_functions instead of zend_module_entry.functions are not seen on reflection.
|
|
||||||
|
|
||||||
Ex: additional_functions from api_module_entry.
|
|
||||||
Ex: in CLI, dl, cli_set_process_title and cli_get_process_title
|
|
||||||
|
|
||||||
Note:
|
|
||||||
- also affects functions overrided in extension
|
|
||||||
(should be be reported in extension, where overrided, not in original extension)
|
|
||||||
- also allow extension to call zend_register_functions for various list
|
|
||||||
(instead of having a single bug list)
|
|
||||||
---
|
|
||||||
NEWS | 1 +
|
|
||||||
Zend/tests/bug66218.phpt | 21 +++++++
|
|
||||||
Zend/zend_builtin_functions.c | 51 ++++++++++-------
|
|
||||||
ext/reflection/php_reflection.c | 66 +++++++++-------------
|
|
||||||
.../tests/ReflectionExtension_bug66218.phpt | 21 +++++++
|
|
||||||
5 files changed, 101 insertions(+), 59 deletions(-)
|
|
||||||
create mode 100644 Zend/tests/bug66218.phpt
|
|
||||||
create mode 100644 ext/reflection/tests/ReflectionExtension_bug66218.phpt
|
|
||||||
|
|
||||||
diff --git a/Zend/tests/bug66218.phpt b/Zend/tests/bug66218.phpt
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..af7a5ab
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/Zend/tests/bug66218.phpt
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+--TEST--
|
|
||||||
+Bug #66218 zend_register_functions breaks reflection
|
|
||||||
+--SKIPIF--
|
|
||||||
+<?php
|
|
||||||
+if (PHP_SAPI != "cli") die("skip CLI only test");
|
|
||||||
+if (!function_exists("dl")) die("skip need dl");
|
|
||||||
+?>
|
|
||||||
+--FILE--
|
|
||||||
+<?php
|
|
||||||
+$tab = get_extension_funcs("standard");
|
|
||||||
+$fcts = array("dl");
|
|
||||||
+foreach ($fcts as $fct) {
|
|
||||||
+ if (in_array($fct, $tab)) {
|
|
||||||
+ echo "$fct Ok\n";
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+?>
|
|
||||||
+Done
|
|
||||||
+--EXPECTF--
|
|
||||||
+dl Ok
|
|
||||||
+Done
|
|
||||||
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
|
|
||||||
index 04f4ebe..12a8fb2 100644
|
|
||||||
--- a/Zend/zend_builtin_functions.c
|
|
||||||
+++ b/Zend/zend_builtin_functions.c
|
|
||||||
@@ -2442,36 +2442,49 @@ ZEND_FUNCTION(extension_loaded)
|
|
||||||
Returns an array with the names of functions belonging to the named extension */
|
|
||||||
ZEND_FUNCTION(get_extension_funcs)
|
|
||||||
{
|
|
||||||
- char *extension_name;
|
|
||||||
- int extension_name_len;
|
|
||||||
+ char *extension_name, *lcname;
|
|
||||||
+ int extension_name_len, array;
|
|
||||||
zend_module_entry *module;
|
|
||||||
- const zend_function_entry *func;
|
|
||||||
-
|
|
||||||
+ HashPosition iterator;
|
|
||||||
+ zend_function *zif;
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &extension_name, &extension_name_len) == FAILURE) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
if (strncasecmp(extension_name, "zend", sizeof("zend"))) {
|
|
||||||
- char *lcname = zend_str_tolower_dup(extension_name, extension_name_len);
|
|
||||||
- if (zend_hash_find(&module_registry, lcname,
|
|
||||||
- extension_name_len+1, (void**)&module) == FAILURE) {
|
|
||||||
- efree(lcname);
|
|
||||||
- RETURN_FALSE;
|
|
||||||
- }
|
|
||||||
+ lcname = zend_str_tolower_dup(extension_name, extension_name_len);
|
|
||||||
+ } else {
|
|
||||||
+ lcname = estrdup("core");
|
|
||||||
+ }
|
|
||||||
+ if (zend_hash_find(&module_registry, lcname,
|
|
||||||
+ extension_name_len+1, (void**)&module) == FAILURE) {
|
|
||||||
efree(lcname);
|
|
||||||
+ RETURN_FALSE;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- if (!(func = module->functions)) {
|
|
||||||
- RETURN_FALSE;
|
|
||||||
- }
|
|
||||||
+ zend_hash_internal_pointer_reset_ex(CG(function_table), &iterator);
|
|
||||||
+ if (module->functions) {
|
|
||||||
+ /* avoid BC break, if functions list is empty, will return an empty array */
|
|
||||||
+ array_init(return_value);
|
|
||||||
+ array = 1;
|
|
||||||
} else {
|
|
||||||
- func = builtin_functions;
|
|
||||||
+ array = 0;
|
|
||||||
+ }
|
|
||||||
+ while (zend_hash_get_current_data_ex(CG(function_table), (void **) &zif, &iterator) == SUCCESS) {
|
|
||||||
+ if (zif->common.type==ZEND_INTERNAL_FUNCTION
|
|
||||||
+ && zif->internal_function.module == module) {
|
|
||||||
+ if (!array) {
|
|
||||||
+ array_init(return_value);
|
|
||||||
+ array = 1;
|
|
||||||
+ }
|
|
||||||
+ add_next_index_string(return_value, zif->common.function_name, 1);
|
|
||||||
+ }
|
|
||||||
+ zend_hash_move_forward_ex(CG(function_table), &iterator);
|
|
||||||
}
|
|
||||||
|
|
||||||
- array_init(return_value);
|
|
||||||
+ efree(lcname);
|
|
||||||
|
|
||||||
- while (func->fname) {
|
|
||||||
- add_next_index_string(return_value, func->fname, 1);
|
|
||||||
- func++;
|
|
||||||
+ if (!array) {
|
|
||||||
+ RETURN_FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
|
|
||||||
index c4a7c55..803b12b 100644
|
|
||||||
--- a/ext/reflection/php_reflection.c
|
|
||||||
+++ b/ext/reflection/php_reflection.c
|
|
||||||
@@ -1105,29 +1105,26 @@
|
|
||||||
string_free(&str_constants);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (module->functions && module->functions->fname) {
|
|
||||||
+ {
|
|
||||||
+ HashPosition iterator;
|
|
||||||
zend_function *fptr;
|
|
||||||
- const zend_function_entry *func = module->functions;
|
|
||||||
-
|
|
||||||
- string_printf(str, "\n - Functions {\n");
|
|
||||||
+ int first = 1;
|
|
||||||
|
|
||||||
- /* Is there a better way of doing this? */
|
|
||||||
- while (func->fname) {
|
|
||||||
- int fname_len = strlen(func->fname);
|
|
||||||
- char *lc_name = zend_str_tolower_dup(func->fname, fname_len);
|
|
||||||
-
|
|
||||||
- if (zend_hash_find(EG(function_table), lc_name, fname_len + 1, (void**) &fptr) == FAILURE) {
|
|
||||||
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Internal error: Cannot find extension function %s in global function table", func->fname);
|
|
||||||
- func++;
|
|
||||||
- efree(lc_name);
|
|
||||||
- continue;
|
|
||||||
+ zend_hash_internal_pointer_reset_ex(CG(function_table), &iterator);
|
|
||||||
+ while (zend_hash_get_current_data_ex(CG(function_table), (void **) &fptr, &iterator) == SUCCESS) {
|
|
||||||
+ if (fptr->common.type==ZEND_INTERNAL_FUNCTION
|
|
||||||
+ && fptr->internal_function.module == module) {
|
|
||||||
+ if (first) {
|
|
||||||
+ string_printf(str, "\n - Functions {\n");
|
|
||||||
+ first = 0;
|
|
||||||
+ }
|
|
||||||
+ _function_string(str, fptr, NULL, " " TSRMLS_CC);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- _function_string(str, fptr, NULL, " " TSRMLS_CC);
|
|
||||||
- efree(lc_name);
|
|
||||||
- func++;
|
|
||||||
+ zend_hash_move_forward_ex(CG(function_table), &iterator);
|
|
||||||
+ }
|
|
||||||
+ if (!first) {
|
|
||||||
+ string_printf(str, "%s }\n", indent);
|
|
||||||
}
|
|
||||||
- string_printf(str, "%s }\n", indent);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
@@ -5264,6 +5261,9 @@
|
|
||||||
{
|
|
||||||
reflection_object *intern;
|
|
||||||
zend_module_entry *module;
|
|
||||||
+ HashPosition iterator;
|
|
||||||
+ zval *function;
|
|
||||||
+ zend_function *fptr;
|
|
||||||
|
|
||||||
if (zend_parse_parameters_none() == FAILURE) {
|
|
||||||
return;
|
|
||||||
@@ -5271,29 +5271,15 @@
|
|
||||||
GET_REFLECTION_OBJECT_PTR(module);
|
|
||||||
|
|
||||||
array_init(return_value);
|
|
||||||
- if (module->functions) {
|
|
||||||
- zval *function;
|
|
||||||
- zend_function *fptr;
|
|
||||||
- const zend_function_entry *func = module->functions;
|
|
||||||
-
|
|
||||||
- /* Is there a better way of doing this? */
|
|
||||||
- while (func->fname) {
|
|
||||||
- int fname_len = strlen(func->fname);
|
|
||||||
- char *lc_name = zend_str_tolower_dup(func->fname, fname_len);
|
|
||||||
-
|
|
||||||
- if (zend_hash_find(EG(function_table), lc_name, fname_len + 1, (void**) &fptr) == FAILURE) {
|
|
||||||
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Internal error: Cannot find extension function %s in global function table", func->fname);
|
|
||||||
- func++;
|
|
||||||
- efree(lc_name);
|
|
||||||
- continue;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
+ zend_hash_internal_pointer_reset_ex(CG(function_table), &iterator);
|
|
||||||
+ while (zend_hash_get_current_data_ex(CG(function_table), (void **) &fptr, &iterator) == SUCCESS) {
|
|
||||||
+ if (fptr->common.type==ZEND_INTERNAL_FUNCTION
|
|
||||||
+ && fptr->internal_function.module == module) {
|
|
||||||
ALLOC_ZVAL(function);
|
|
||||||
reflection_function_factory(fptr, NULL, function TSRMLS_CC);
|
|
||||||
- add_assoc_zval_ex(return_value, func->fname, fname_len+1, function);
|
|
||||||
- func++;
|
|
||||||
- efree(lc_name);
|
|
||||||
+ add_assoc_zval(return_value, fptr->common.function_name, function);
|
|
||||||
}
|
|
||||||
+ zend_hash_move_forward_ex(CG(function_table), &iterator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
diff --git a/ext/reflection/tests/ReflectionExtension_bug66218.phpt b/ext/reflection/tests/ReflectionExtension_bug66218.phpt
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..e263624
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/ext/reflection/tests/ReflectionExtension_bug66218.phpt
|
|
||||||
@@ -0,0 +1,21 @@
|
|
||||||
+--TEST--
|
|
||||||
+ReflectionExtension::getFunctions() ##6218 zend_register_functions breaks reflection
|
|
||||||
+--SKIPIF--
|
|
||||||
+<?php
|
|
||||||
+if (!extension_loaded('reflection')) print 'skip missing reflection extension';
|
|
||||||
+if (PHP_SAPI != "cli") die("skip CLI only test");
|
|
||||||
+if (!function_exists("dl")) die("skip need dl");
|
|
||||||
+?>
|
|
||||||
+--FILE--
|
|
||||||
+<?php
|
|
||||||
+$r = new ReflectionExtension('standard');
|
|
||||||
+$t = $r->getFunctions();
|
|
||||||
+var_dump($t['dl']);
|
|
||||||
+?>
|
|
||||||
+Done
|
|
||||||
+--EXPECTF--
|
|
||||||
+object(ReflectionFunction)#%d (1) {
|
|
||||||
+ ["name"]=>
|
|
||||||
+ string(2) "dl"
|
|
||||||
+}
|
|
||||||
+Done
|
|
||||||
--
|
|
||||||
1.8.4.3
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
From 60d2e70c062e436a6c6cd3c8a17469a083a38b46 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
|
||||||
Date: Tue, 10 Dec 2013 12:07:46 +0100
|
|
||||||
Subject: [PATCH] Zend: fix overflow handling bug in non-x86
|
|
||||||
fast_add_function()
|
|
||||||
|
|
||||||
The 'result' argument of fast_add_function() may alias with either
|
|
||||||
of its operands (or both). Take care not to write to 'result' before
|
|
||||||
reading op1 and op2.
|
|
||||||
---
|
|
||||||
Zend/zend_operators.h | 9 +++++++--
|
|
||||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
|
|
||||||
index 0152e03..5c6fc86 100644
|
|
||||||
--- a/Zend/zend_operators.h
|
|
||||||
+++ b/Zend/zend_operators.h
|
|
||||||
@@ -640,13 +640,18 @@ static zend_always_inline int fast_add_function(zval *result, zval *op1, zval *o
|
|
||||||
"n"(ZVAL_OFFSETOF_TYPE)
|
|
||||||
: "rax","cc");
|
|
||||||
#else
|
|
||||||
- Z_LVAL_P(result) = Z_LVAL_P(op1) + Z_LVAL_P(op2);
|
|
||||||
+ /*
|
|
||||||
+ * 'result' may alias with op1 or op2, so we need to
|
|
||||||
+ * ensure that 'result' is not updated until after we
|
|
||||||
+ * have read the values of op1 and op2.
|
|
||||||
+ */
|
|
||||||
|
|
||||||
if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) == (Z_LVAL_P(op2) & LONG_SIGN_MASK)
|
|
||||||
- && (Z_LVAL_P(op1) & LONG_SIGN_MASK) != (Z_LVAL_P(result) & LONG_SIGN_MASK))) {
|
|
||||||
+ && (Z_LVAL_P(op1) & LONG_SIGN_MASK) != ((Z_LVAL_P(op1) + Z_LVAL_P(op2)) & LONG_SIGN_MASK))) {
|
|
||||||
Z_DVAL_P(result) = (double) Z_LVAL_P(op1) + (double) Z_LVAL_P(op2);
|
|
||||||
Z_TYPE_P(result) = IS_DOUBLE;
|
|
||||||
} else {
|
|
||||||
+ Z_LVAL_P(result) = Z_LVAL_P(op1) + Z_LVAL_P(op2);
|
|
||||||
Z_TYPE_P(result) = IS_LONG;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
--
|
|
||||||
1.8.4.3
|
|
||||||
|
|
21
php.spec
21
php.spec
@ -68,7 +68,7 @@
|
|||||||
|
|
||||||
Summary: PHP scripting language for creating dynamic web sites
|
Summary: PHP scripting language for creating dynamic web sites
|
||||||
Name: php
|
Name: php
|
||||||
Version: 5.5.7
|
Version: 5.5.8
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
# All files licensed under PHP version 3.01, except
|
# All files licensed under PHP version 3.01, except
|
||||||
# Zend is licensed under Zend
|
# Zend is licensed under Zend
|
||||||
@ -121,12 +121,6 @@ Patch46: php-5.4.9-fixheader.patch
|
|||||||
Patch47: php-5.4.9-phpinfo.patch
|
Patch47: php-5.4.9-phpinfo.patch
|
||||||
|
|
||||||
# Upstream fixes
|
# Upstream fixes
|
||||||
# 66060 Heap buffer over-read in DateInterval
|
|
||||||
Patch100: php-bug66060.patch
|
|
||||||
# 66218 zend_register_functions breaks reflection
|
|
||||||
Patch101: php-bug66218.patch
|
|
||||||
# Zend: fix overflow handling bug in non-x86
|
|
||||||
Patch102: php-bugarm.patch
|
|
||||||
|
|
||||||
# Security fixes
|
# Security fixes
|
||||||
|
|
||||||
@ -296,10 +290,6 @@ Provides: php-pecl-zendopcache = %{opcachever}
|
|||||||
Provides: php-pecl-zendopcache%{?_isa} = %{opcachever}
|
Provides: php-pecl-zendopcache%{?_isa} = %{opcachever}
|
||||||
Provides: php-pecl(opcache) = %{opcachever}
|
Provides: php-pecl(opcache) = %{opcachever}
|
||||||
Provides: php-pecl(opcache)%{?_isa} = %{opcachever}
|
Provides: php-pecl(opcache)%{?_isa} = %{opcachever}
|
||||||
# Only one opcode cache could be enabled
|
|
||||||
Conflicts: php-xcache
|
|
||||||
# APC 3.1.15 offer an option to disable opcache
|
|
||||||
Conflicts: php-pecl-apc < 3.1.15
|
|
||||||
|
|
||||||
%description opcache
|
%description opcache
|
||||||
The Zend OPcache provides faster PHP execution through opcode caching and
|
The Zend OPcache provides faster PHP execution through opcode caching and
|
||||||
@ -736,10 +726,6 @@ support for using the enchant library to PHP.
|
|||||||
%patch46 -p1 -b .fixheader
|
%patch46 -p1 -b .fixheader
|
||||||
%patch47 -p1 -b .phpinfo
|
%patch47 -p1 -b .phpinfo
|
||||||
|
|
||||||
%patch100 -p1 -b .bug66060
|
|
||||||
%patch101 -p1 -b .bug66218
|
|
||||||
%patch102 -p1 -b .bugarm
|
|
||||||
|
|
||||||
|
|
||||||
# Prevent %%doc confusion over LICENSE files
|
# Prevent %%doc confusion over LICENSE files
|
||||||
cp Zend/LICENSE Zend/ZEND_LICENSE
|
cp Zend/LICENSE Zend/ZEND_LICENSE
|
||||||
@ -1550,6 +1536,11 @@ exit 0
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Jan 8 2014 Remi Collet <rcollet@redhat.com> 5.5.8-1
|
||||||
|
- update to 5.5.8
|
||||||
|
- drop conflicts with other opcode caches as both can
|
||||||
|
be used only for user data cache
|
||||||
|
|
||||||
* Wed Dec 11 2013 Remi Collet <rcollet@redhat.com> 5.5.7-1
|
* Wed Dec 11 2013 Remi Collet <rcollet@redhat.com> 5.5.7-1
|
||||||
- update to 5.5.7, fix for CVE-2013-6420
|
- update to 5.5.7, fix for CVE-2013-6420
|
||||||
- fix zend_register_functions breaks reflection, php bug 66218
|
- fix zend_register_functions breaks reflection, php bug 66218
|
||||||
|
Loading…
Reference in New Issue
Block a user