1
0
mirror of https://github.com/php/php-src.git synced 2026-04-14 19:41:05 +02:00

Merge branch 'PHP-7.0' of https://github.com/php/php-src into PHP-7.0

This commit is contained in:
Joe Watkins
2016-04-11 08:04:14 +01:00
10 changed files with 318 additions and 28 deletions

6
NEWS
View File

@@ -43,6 +43,8 @@ PHP NEWS
. Fixed bug #70451, #70452 (Inconsistencies in return values of
IntlChar methods). (Daniel Persson)
. Fixed bug #68893 (Stackoverflow in datefmt_create). (Anatol)
. Fixed bug #66289 (Locale::lookup incorrectly returns en or en_US if locale
is empty). (Anatol)
- ODBC:
. Fixed bug #63171 (Script hangs after max_execution_time). (Remi)
@@ -70,6 +72,8 @@ PHP NEWS
- Postgres:
. Fixed bug #71820 (pg_fetch_object binds parameters before call
constructor). (Anatol)
. Fixed bug #71998 (Function pg_insert does not insert when column
type = inet). (Anatol)
- SOAP:
. Fixed bug #71986 (Nested foreach assign-by-reference creates broken
@@ -84,6 +88,8 @@ PHP NEWS
. Fixed bug #52339 (SPL autoloader breaks class_exists()). (Nikita)
- Standard:
. Fixed bug #71995 (Returning the same var twice from __sleep() produces
broken serialized data). (Laruence)
. Fixed bug #71940 (Unserialize crushes on restore object reference).
(Laruence)
. Fixed bug #71969 (str_replace returns an incorrect resulting array after

View File

@@ -1548,7 +1548,11 @@ PHP_FUNCTION(locale_lookup)
}
if(loc_range_len == 0) {
loc_range = intl_locale_get_default();
if(fallback_loc_str) {
loc_range = ZSTR_VAL(fallback_loc_str);
} else {
loc_range = intl_locale_get_default();
}
}
hash_arr = Z_ARRVAL_P(arr);

View File

@@ -23,6 +23,7 @@
#include "php_intl.h"
#include "msgformat_class.h"
#include "msgformat_data.h"
#include "intl_convert.h"
/* {{{ */

View File

@@ -21,11 +21,11 @@
#include "php_intl.h"
#include "msgformat_class.h"
#include "msgformat_attr.h"
#include "msgformat_data.h"
#include "intl_convert.h"
#include <unicode/ustring.h>
/* {{{ proto string MessageFormatter::getPattern( )
* Get formatter pattern. }}} */
/* {{{ proto string msgfmt_get_pattern( MessageFormatter $mf )

View File

@@ -0,0 +1,27 @@
--TEST--
Bug #66289 Locale::lookup incorrectly returns en or en_US if locale is empty
--SKIPIF--
<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
--FILE--
<?php
ini_set("intl.default_locale", "en-US");
$availableLocales = array('fr_FR', 'de', 'es_ES', 'es_419', 'en_US');
var_dump(locale_lookup($availableLocales, false, true, 'fr_FR'));
var_dump(locale_lookup($availableLocales, false, true, null));
$availableLocales = array('fr_FR', 'de', 'es_ES', 'es_419');
var_dump(locale_lookup($availableLocales, false, true, 'fr_FR'));
ini_set("intl.default_locale", "de-DE");
$availableLocales = array(Locale::getDefault());
var_dump(locale_lookup($availableLocales, false, true));
?>
==DONE==
--EXPECT--
string(5) "fr_fr"
string(5) "en_us"
string(5) "fr_fr"
string(5) "de_de"
==DONE==

View File

@@ -6,11 +6,11 @@ PHP_ARG_ENABLE(opcache, whether to enable Zend OPcache support,
[ --disable-opcache Disable Zend OPcache support], yes)
PHP_ARG_ENABLE(opcache-file, whether to enable file based caching,
[ --disable-opcache-file Disable file based caching], yes)
[ --disable-opcache-file Disable file based caching], yes, no)
PHP_ARG_ENABLE(huge-code-pages, whether to enable copying PHP CODE pages into HUGE PAGES,
[ --disable-huge-code-pages
Disable copying PHP CODE pages into HUGE PAGES], yes)
Disable copying PHP CODE pages into HUGE PAGES], yes, no)
if test "$PHP_OPCACHE" != "no"; then
@@ -376,7 +376,7 @@ AC_TRY_RUN([
AC_MSG_RESULT("yes")
], AC_MSG_RESULT("no") )
if test "$flock_type" == "unknown"; then
if test "$flock_type" = "unknown"; then
AC_MSG_ERROR([Don't know how to define struct flock on this system[,] set --enable-opcache=no])
fi

View File

@@ -6145,8 +6145,11 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
ZVAL_STRINGL(&new_val, "NULL", sizeof("NULL")-1);
}
else {
/* better regex? IPV6 and IPV4 */
if (php_pgsql_convert_match(Z_STRVAL_P(val), Z_STRLEN_P(val), "^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$", 0) == FAILURE) {
/* The inet type holds an IPv4 or IPv6 host address, and optionally its subnet, all in one field. See more in the doc.
The regex might still be not perfect, but catches the most of IP variants. We might decide to remove the regex
at all though and let the server side to handle it.*/
if (php_pgsql_convert_match(Z_STRVAL_P(val), Z_STRLEN_P(val), "^((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])(\/[0-9]{1,3})?$", 0) == FAILURE
&& php_pgsql_convert_match(Z_STRVAL_P(val), Z_STRLEN_P(val), "^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(\/[0-9]{1,3})?$", 0) == FAILURE) {
err = 1;
}
else {
@@ -6165,7 +6168,7 @@ PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, con
}
PGSQL_CONV_CHECK_IGNORE();
if (err) {
php_error_docref(NULL, E_NOTICE, "Expects NULL or string for '%s' (%s)", Z_STRVAL_P(type), ZSTR_VAL(field));
php_error_docref(NULL, E_NOTICE, "Expects NULL or IPv4 or IPv6 address string for '%s' (%s)", Z_STRVAL_P(type), ZSTR_VAL(field));
}
break;

View File

@@ -0,0 +1,196 @@
--TEST--
Bug #71998 Function pg_insert does not insert when column type = inet
--SKIPIF--
<?php include("skipif.inc"); ?>
--FILE--
<?php
// Kudos for the IP regex to
// http://stackoverflow.com/a/17871737/3358424
include('config.inc');
$db = pg_connect($conn_str);
pg_query("CREATE TABLE tmp_statistics (id integer NOT NULL, remote_addr inet);");
$ips = array(
/* IPv4*/
"127.0.0.1",
"10.0.0.1",
"192.168.1.1",
"0.0.0.0",
"255.255.255.255",
"192.168.1.35/24",
/* IPv6 */
"::1",
"::10.2.3.4",
"::ffff:10.4.3.2",
"1:2:3:4:5:6:7:8",
"::ffff:10.0.0.1",
"::ffff:1.2.3.4",
"::ffff:0.0.0.0",
"1:2:3:4:5:6:77:88",
"::ffff:255.255.255.255",
"fe08::7:8",
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
"::5:aef1:ffff/128",
"2001:4f8:3:ba::/112",
);
$bad = array(
/* bad */
"256.257.258.259",
"fe08::7:8interface",
"schnitzel",
"10002.3.4",
"1.2.3.4.5",
"256.0.0.0",
"260.0.0.0",
);
$ips = array_merge($ips, $bad);
$i = 0;
$errors = 0;
foreach ($ips as $ip) {
$data = array("id" => ++$i, "remote_addr" => $ip);
$r = @pg_insert($db, 'tmp_statistics', $data);
if (!$r && in_array($ip, $bad)) {
$errors++;
//echo pg_last_error($db);
}
//pg_query($db, "INSERT INTO tmp_statistics (id, remote_addr) VALUES (2, '127.0.0.1')"); // OK, record inserted
}
$r = pg_query($db, "SELECT * FROM tmp_statistics");
while (false != ($row = pg_fetch_row($r))) {
var_dump($row);
}
echo $errors, " errors catched\n";
pg_query($db, "DROP TABLE tmp_statistics");
pg_close($db);
?>
==DONE==
--EXPECT--
array(2) {
[0]=>
string(1) "1"
[1]=>
string(9) "127.0.0.1"
}
array(2) {
[0]=>
string(1) "2"
[1]=>
string(8) "10.0.0.1"
}
array(2) {
[0]=>
string(1) "3"
[1]=>
string(11) "192.168.1.1"
}
array(2) {
[0]=>
string(1) "4"
[1]=>
string(7) "0.0.0.0"
}
array(2) {
[0]=>
string(1) "5"
[1]=>
string(15) "255.255.255.255"
}
array(2) {
[0]=>
string(1) "6"
[1]=>
string(15) "192.168.1.35/24"
}
array(2) {
[0]=>
string(1) "7"
[1]=>
string(3) "::1"
}
array(2) {
[0]=>
string(1) "8"
[1]=>
string(10) "::10.2.3.4"
}
array(2) {
[0]=>
string(1) "9"
[1]=>
string(15) "::ffff:10.4.3.2"
}
array(2) {
[0]=>
string(2) "10"
[1]=>
string(15) "1:2:3:4:5:6:7:8"
}
array(2) {
[0]=>
string(2) "11"
[1]=>
string(15) "::ffff:10.0.0.1"
}
array(2) {
[0]=>
string(2) "12"
[1]=>
string(14) "::ffff:1.2.3.4"
}
array(2) {
[0]=>
string(2) "13"
[1]=>
string(14) "::ffff:0.0.0.0"
}
array(2) {
[0]=>
string(2) "14"
[1]=>
string(17) "1:2:3:4:5:6:77:88"
}
array(2) {
[0]=>
string(2) "15"
[1]=>
string(22) "::ffff:255.255.255.255"
}
array(2) {
[0]=>
string(2) "16"
[1]=>
string(9) "fe08::7:8"
}
array(2) {
[0]=>
string(2) "17"
[1]=>
string(39) "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
}
array(2) {
[0]=>
string(2) "18"
[1]=>
string(13) "::5:aef1:ffff"
}
array(2) {
[0]=>
string(2) "19"
[1]=>
string(19) "2001:4f8:3:ba::/112"
}
7 errors catched
==DONE==

View File

@@ -0,0 +1,27 @@
--TEST--
Bug #71995 (Returning the same var twice from __sleep() produces broken serialized data)
--FILE--
<?php
class A {
public $b;
public function __construct() {
$this->b = new StdClass();
}
public function __sleep() {
return array("b", "b");
}
}
$a = new A();
$s = serialize($a);
var_dump($s);
var_dump(unserialize($s));
?>
--EXPECTF--
Notice: serialize(): "b" is returned from __sleep multiple times in %sbug71995.php on line %d
string(39) "O:1:"A":1:{s:1:"b";O:8:"stdClass":0:{}}"
object(A)#%d (1) {
["b"]=>
object(stdClass)#%d (0) {
}
}

View File

@@ -666,6 +666,36 @@ static inline zend_bool php_var_serialize_class_name(smart_str *buf, zval *struc
}
/* }}} */
static HashTable *php_var_serialize_collect_names(HashTable *src, uint32_t count, zend_bool incomplete) /* {{{ */ {
zval *val;
HashTable *ht;
zend_string *key, *name;
ALLOC_HASHTABLE(ht);
zend_hash_init(ht, count, NULL, NULL, 0);
ZEND_HASH_FOREACH_STR_KEY_VAL(src, key, val) {
if (incomplete && strcmp(ZSTR_VAL(key), MAGIC_MEMBER) == 0) {
continue;
}
if (Z_TYPE_P(val) != IS_STRING) {
php_error_docref(NULL, E_NOTICE,
"__sleep should return an array only containing the names of instance-variables to serialize.");
}
name = zval_get_string(val);
if (zend_hash_exists(ht, name)) {
php_error_docref(NULL, E_NOTICE,
"\"%s\" is returned from __sleep multiple times", ZSTR_VAL(name));
zend_string_release(name);
continue;
}
zend_hash_add_empty_element(ht, name);
zend_string_release(name);
} ZEND_HASH_FOREACH_END();
return ht;
}
/* }}} */
static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_ptr, php_serialize_data_t var_hash) /* {{{ */
{
uint32_t count;
@@ -686,37 +716,29 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
}
} else {
count = 0;
ht = NULL;
}
smart_str_append_unsigned(buf, count);
smart_str_appendl(buf, ":{", 2);
if (count > 0) {
zend_string *key;
zval *d, *val;
zval *d;
zval nval, *nvalp;
zend_string *name;
HashTable *propers;
HashTable *names, *propers;
names = php_var_serialize_collect_names(ht, count, incomplete_class);
smart_str_append_unsigned(buf, zend_hash_num_elements(names));
smart_str_appendl(buf, ":{", 2);
ZVAL_NULL(&nval);
nvalp = &nval;
propers = Z_OBJPROP_P(struc);
ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
if (incomplete_class && strcmp(ZSTR_VAL(key), MAGIC_MEMBER) == 0) {
continue;
}
if (Z_TYPE_P(val) != IS_STRING) {
php_error_docref(NULL, E_NOTICE,
"__sleep should return an array only containing the names of instance-variables to serialize.");
}
name = zval_get_string(val);
propers = Z_OBJPROP_P(struc);
ZEND_HASH_FOREACH_STR_KEY(names, name) {
if ((d = zend_hash_find(propers, name)) != NULL) {
if (Z_TYPE_P(d) == IS_INDIRECT) {
d = Z_INDIRECT_P(d);
if (Z_TYPE_P(d) == IS_UNDEF) {
zend_string_release(name);
continue;
}
}
@@ -769,10 +791,14 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
php_var_serialize_intern(buf, nvalp, var_hash);
}
}
zend_string_release(name);
} ZEND_HASH_FOREACH_END();
smart_str_appendc(buf, '}');
zend_hash_destroy(names);
FREE_HASHTABLE(names);
} else {
smart_str_appendl(buf, "0:{}", 4);
}
smart_str_appendc(buf, '}');
}
/* }}} */