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:
6
NEWS
6
NEWS
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "php_intl.h"
|
||||
#include "msgformat_class.h"
|
||||
#include "msgformat_data.h"
|
||||
#include "intl_convert.h"
|
||||
|
||||
/* {{{ */
|
||||
|
||||
@@ -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 )
|
||||
|
||||
27
ext/intl/tests/locale_bug66289.phpt
Normal file
27
ext/intl/tests/locale_bug66289.phpt
Normal 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==
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
196
ext/pgsql/tests/bug71998.phpt
Normal file
196
ext/pgsql/tests/bug71998.phpt
Normal 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==
|
||||
27
ext/standard/tests/serialize/bug71995.phpt
Normal file
27
ext/standard/tests/serialize/bug71995.phpt
Normal 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) {
|
||||
}
|
||||
}
|
||||
@@ -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, '}');
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user