1
0
mirror of https://github.com/php/php-src.git synced 2026-04-03 22:22:18 +02:00
This commit is contained in:
Joe Watkins
2016-03-31 12:39:58 +01:00
51 changed files with 985 additions and 192 deletions

5
NEWS
View File

@@ -15,6 +15,11 @@ PHP NEWS
. Added support for negative string offsets in string offset syntax and
various string functions. (Francois)
. Added a form of the list() construct where keys can be specified. (Andrea)
. Number operators taking numeric strings now emit E_NOTICEs or E_WARNINGs
when given malformed numeric strings. (Andrea)
. (int), intval() where $base is 10 or unspecified, settype(), decbin(),
decoct(), dechex(), integer operators and other conversions now always
respect scientific notation in numeric strings. (Andrea)
- FTP:
. Implemented FR #55651 (Option to ignore the returned FTP PASV address).

View File

@@ -21,6 +21,10 @@ PHP 7.1 UPGRADE NOTES
- Core:
. 'void' can no longer be used as the name of a class, interface, or trait.
This applies to declarations, class_alias() and use statements.
. (int), intval() where $base is 10 or unspecified, settype(), decbin(),
decoct(), dechex(), integer operators and other conversions now always
respect scientific notation in numeric strings.
(RFC: https://wiki.php.net/rfc/invalid_strings_in_arithmetic)
- JSON:
. When calling json_encode with JSON_UNESCAPED_UNICODE option, U+2028 and
@@ -37,6 +41,17 @@ PHP 7.1 UPGRADE NOTES
(RFC: https://wiki.php.net/rfc/negative-string-offsets)
. Added a form of the list() construct where keys can be specified.
(RFC: https://wiki.php.net/rfc/list_keys)
. Number operators taking numeric strings now emit "A non well formed numeric
value encountered" E_NOTICEs for leading-numeric strings, and "A
non-numeric value encountered" E_WARNINGs for non-numeric strings.
This always applies to the +, -, *, /, **, %, << and >> operators, and
their assignment counterparts +=, -=, *=, /=, **=, %=, <<= and >>=.
For the bitwise operators |, & and ^, and their assignment counterparts
|=, &= and ^=, this only applies where only one operand is a string.
Note that this never applies to the bitwise NOT operator, ~, which does not
handle numeric strings, nor to the increment and decrement operators
++ and --, which have a unique approach to handling numeric strings.
(RFC: https://wiki.php.net/rfc/invalid_strings_in_arithmetic)
========================================
3. Changes in SAPI modules

View File

@@ -38,11 +38,19 @@ var_dump($c);
echo "Done\n";
?>
--EXPECTF--
Warning: A non-numeric value encountered in %s on line %d
int(75636)
Notice: A non well formed numeric value encountered in %s on line %d
int(951858)
int(48550510)
float(75661.68)
Warning: A non-numeric value encountered in %s on line %d
int(75636)
Notice: A non well formed numeric value encountered in %s on line %d
int(951858)
int(48550510)
float(75661.68)

View File

@@ -19,8 +19,13 @@ var_dump($c);
echo "Done\n";
?>
--EXPECTF--
Warning: A non-numeric value encountered in %s on line %d
Exception: Unsupported operand types
Warning: A non-numeric value encountered in %s on line %d
Fatal error: Uncaught Error: Unsupported operand types in %s:%d
Stack trace:
#0 {main}

View File

@@ -0,0 +1,16 @@
--TEST--
Closure::__invoke() is case insensitive
--FILE--
<?php
$inc = function(&$n) {
$n++;
};
$n = 1;
$inc->__INVOKE($n);
var_dump($n);
?>
--EXPECT--
int(2)

View File

@@ -42,7 +42,9 @@ var_dump(
);
?>
--EXPECT--
--EXPECTF--
Warning: A non-numeric value encountered in %s on line %d
int(3)
string(4) "1foo"
bool(false)

View File

@@ -0,0 +1,52 @@
--TEST--
Integer conversion from scientific notation
--FILE--
<?php
var_dump((int)"1.2345e9");
var_dump((int)"-1.2345e9");
var_dump(intval("1.2345e9"));
var_dump(intval("-1.2345e9"));
var_dump("1.2345e9" % PHP_INT_MAX);
var_dump("-1.2345e9" % PHP_INT_MIN);
var_dump("1.2345e9" | 0);
var_dump("-1.2345e9" | 0);
echo PHP_EOL;
var_dump((int)" 1.2345e9 abc");
var_dump((int)" -1.2345e9 abc");
var_dump(intval(" 1.2345e9 abc"));
var_dump(intval(" -1.2345e9 abc"));
var_dump(" 1.2345e9 abc" % PHP_INT_MAX);
var_dump(" -1.2345e9 abc" % PHP_INT_MIN);
var_dump(" 1.2345e9 abc" | 0);
var_dump(" -1.2345e9 abc" | 0);
?>
--EXPECTF--
int(1234500000)
int(-1234500000)
int(1234500000)
int(-1234500000)
int(1234500000)
int(-1234500000)
int(1234500000)
int(-1234500000)
int(1234500000)
int(-1234500000)
int(1234500000)
int(-1234500000)
Notice: A non well formed numeric value encountered in %s on line %d
int(1234500000)
Notice: A non well formed numeric value encountered in %s on line %d
int(-1234500000)
Notice: A non well formed numeric value encountered in %s on line %d
int(1234500000)
Notice: A non well formed numeric value encountered in %s on line %d
int(-1234500000)

View File

@@ -0,0 +1,195 @@
--TEST--
Invalid numeric string E_WARNINGs and E_NOTICEs
--FILE--
<?php
var_dump("2 Lorem" + "3 ipsum");
var_dump("dolor" + "sit");
echo "---", PHP_EOL;
var_dump("5 amet," - "7 consectetur");
var_dump("adipiscing" - "elit,");
echo "---", PHP_EOL;
var_dump("11 sed" * "13 do");
var_dump("eiusmod" * "tempor");
echo "---", PHP_EOL;
var_dump("17 incididunt" / "19 ut");
var_dump("labore" / "et");
echo "---", PHP_EOL;
var_dump("23 dolore" ** "29 magna");
var_dump("aliqua." ** "Ut");
echo "---", PHP_EOL;
var_dump("31 enim" % "37 ad");
try {
var_dump("minim" % "veniam,");
} catch (DivisionByZeroError $e) {
}
echo "---", PHP_EOL;
var_dump("41 minim" << "43 veniam,");
var_dump("quis" << "nostrud");
echo "---", PHP_EOL;
var_dump("47 exercitation" >> "53 ullamco");
var_dump("laboris" >> "nisi");
echo "---", PHP_EOL;
var_dump("59 ut" | 61);
var_dump(67 | "71 aliquip");
var_dump("ex" | 73);
var_dump(79 | "ea");
echo "---", PHP_EOL;
var_dump("83 commodo" & 89);
var_dump(97 & "101 consequat.");
var_dump("Duis" & 103);
var_dump(107 & "aute");
echo "---", PHP_EOL;
var_dump("109 irure" ^ 113);
var_dump(127 ^ "131 dolor");
var_dump("in" ^ 137);
var_dump(139 ^ "reprehenderit");
echo "---", PHP_EOL;
var_dump(+"149 in");
var_dump(+"voluptate");
echo "---", PHP_EOL;
var_dump(-"151 velit");
var_dump(-"esse");
?>
--EXPECTF--
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(5)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(-2)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(143)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
float(0.89473684210526)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
Warning: Division by zero in %s on line %d
float(NAN)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
float(3.0910586430935E+39)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(1)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(31)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(%d)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(0)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(63)
Notice: A non well formed numeric value encountered in %s on line %d
int(71)
Warning: A non-numeric value encountered in %s on line %d
int(73)
Warning: A non-numeric value encountered in %s on line %d
int(79)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(81)
Notice: A non well formed numeric value encountered in %s on line %d
int(97)
Warning: A non-numeric value encountered in %s on line %d
int(0)
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(28)
Notice: A non well formed numeric value encountered in %s on line %d
int(252)
Warning: A non-numeric value encountered in %s on line %d
int(137)
Warning: A non-numeric value encountered in %s on line %d
int(139)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(149)
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(-151)
Warning: A non-numeric value encountered in %s on line %d
int(0)

View File

@@ -0,0 +1,236 @@
--TEST--
Invalid numeric string E_WARNINGs and E_NOTICEs, combined assignment operations
--FILE--
<?php
// prevents CT eval
function foxcache($val) {
return [$val][0];
}
$a = foxcache("2 Lorem");
$a += "3 ipsum";
var_dump($a);
$a = foxcache("dolor");
$a += "sit";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("5 amet,");
$a -= "7 consectetur";
var_dump($a);
$a = foxcache("adipiscing");
$a -= "elit,";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("11 sed");
$a *= "13 do";
var_dump($a);
$a = foxcache("eiusmod");
$a *= "tempor";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("17 incididunt");
$a /= "19 ut";
var_dump($a);
$a = foxcache("labore");
$a /= "et";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("23 dolore");
$a **= "29 magna";
var_dump($a);
$a = foxcache("aliqua.");
$a **= "Ut";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("31 enim");
$a %= "37 ad";
var_dump($a);
try {
$a = foxcache("minim");
$a %= "veniam,";
var_dump($a);
} catch (DivisionByZeroError $e) {
}
echo "---", PHP_EOL;
$a = foxcache("41 minim");
$a <<= "43 veniam,";
var_dump($a);
$a = foxcache("quis");
$a <<= "nostrud";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("47 exercitation");
$a >>= "53 ullamco";
var_dump($a);
$a = foxcache("laboris");
$a >>= "nisi";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("59 ut");
$a |= 61;
var_dump($a);
$a = foxcache(67);
$a |= "71 aliquip";
var_dump($a);
$a = foxcache("ex");
$a |= 73;
var_dump($a);
$a = foxcache(79);
$a |= "ea";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("83 commodo");
$a &= 89;
var_dump($a);
$a = foxcache(97);
$a &= "101 consequat.";
var_dump($a);
$a = foxcache("Duis");
$a &= 103;
var_dump($a);
$a = foxcache(107);
$a &= "aute";
var_dump($a);
echo "---", PHP_EOL;
$a = foxcache("109 irure");
$a ^= 113;
var_dump($a);
$a = foxcache(127);
$a ^= "131 dolor";
var_dump($a);
$a = foxcache("in");
$a ^= 137;
var_dump($a);
$a = foxcache(139);
$a ^= "reprehenderit";
var_dump($a);
?>
--EXPECTF--
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(5)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(-2)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(143)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
float(0.89473684210526)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
Warning: Division by zero in %s on line %d
float(NAN)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
float(3.0910586430935E+39)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(1)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(31)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(%d)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
int(0)
Warning: A non-numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(63)
Notice: A non well formed numeric value encountered in %s on line %d
int(71)
Warning: A non-numeric value encountered in %s on line %d
int(73)
Warning: A non-numeric value encountered in %s on line %d
int(79)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(81)
Notice: A non well formed numeric value encountered in %s on line %d
int(97)
Warning: A non-numeric value encountered in %s on line %d
int(0)
Warning: A non-numeric value encountered in %s on line %d
int(0)
---
Notice: A non well formed numeric value encountered in %s on line %d
int(28)
Notice: A non well formed numeric value encountered in %s on line %d
int(252)
Warning: A non-numeric value encountered in %s on line %d
int(137)
Warning: A non-numeric value encountered in %s on line %d
int(139)

View File

@@ -20,6 +20,10 @@ echo "Done\n";
?>
--EXPECTF--
int(18)
Warning: A non-numeric value encountered in %s on line %d
int(0)
Notice: A non well formed numeric value encountered in %s on line %d
int(33)
Done

View File

@@ -20,6 +20,10 @@ echo "Done\n";
?>
--EXPECTF--
int(13)
Warning: A non-numeric value encountered in %s on line %d
int(0)
Notice: A non well formed numeric value encountered in %s on line %d
int(3)
Done

View File

@@ -20,6 +20,10 @@ echo "Done\n";
?>
--EXPECTF--
int(127)
Warning: A non-numeric value encountered in %s on line %d
int(11)
Notice: A non well formed numeric value encountered in %s on line %d
int(45345)
Done

View File

@@ -20,6 +20,10 @@ echo "Done\n";
?>
--EXPECTF--
int(109)
Warning: A non-numeric value encountered in %s on line %d
int(11)
Notice: A non well formed numeric value encountered in %s on line %d
int(45312)
Done

View File

@@ -20,6 +20,10 @@ echo "Done\n";
?>
--EXPECTF--
int(492)
Warning: A non-numeric value encountered in %s on line %d
int(0)
Notice: A non well formed numeric value encountered in %s on line %d
int(362760)
Done

View File

@@ -20,6 +20,10 @@ echo "Done\n";
?>
--EXPECTF--
int(30)
Warning: A non-numeric value encountered in %s on line %d
int(0)
Notice: A non well formed numeric value encountered in %s on line %d
int(5668)
Done

View File

@@ -370,11 +370,7 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_long_cap_weak(zval *arg, zend_long *de
if (UNEXPECTED(zend_isnan(Z_DVAL_P(arg)))) {
return 0;
}
if (UNEXPECTED(!ZEND_DOUBLE_FITS_LONG(Z_DVAL_P(arg)))) {
*dest = (Z_DVAL_P(arg) > 0) ? ZEND_LONG_MAX : ZEND_LONG_MIN;
} else {
*dest = zend_dval_to_lval(Z_DVAL_P(arg));
}
*dest = zend_dval_to_lval_cap(Z_DVAL_P(arg));
} else if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
double d;
int type;
@@ -384,11 +380,7 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_long_cap_weak(zval *arg, zend_long *de
if (UNEXPECTED(zend_isnan(d))) {
return 0;
}
if (UNEXPECTED(!ZEND_DOUBLE_FITS_LONG(d))) {
*dest = (d > 0) ? ZEND_LONG_MAX : ZEND_LONG_MIN;
} else {
*dest = zend_dval_to_lval(d);
}
*dest = zend_dval_to_lval_cap(d);
} else {
return 0;
}

View File

@@ -297,14 +297,10 @@ ZEND_API zval* zend_get_closure_this_ptr(zval *obj) /* {{{ */
static zend_function *zend_closure_get_method(zend_object **object, zend_string *method, const zval *key) /* {{{ */
{
zend_string *lc_name;
lc_name = zend_string_tolower(method);
if (zend_string_equals_literal(method, ZEND_INVOKE_FUNC_NAME)) {
zend_string_release(lc_name);
if (zend_string_equals_literal_ci(method, ZEND_INVOKE_FUNC_NAME)) {
return zend_get_closure_invoke_method(*object);
}
zend_string_release(lc_name);
return std_object_handlers.get_method(object, method, key);
}
/* }}} */

View File

@@ -6237,6 +6237,35 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
}
/* }}} */
ZEND_API zend_bool zend_binary_op_produces_numeric_string_error(uint32_t opcode, zval *op1, zval *op2) /* {{{ */
{
if (!(opcode == ZEND_ADD || opcode == ZEND_SUB || opcode == ZEND_MUL || opcode == ZEND_DIV
|| opcode == ZEND_POW || opcode == ZEND_MOD || opcode == ZEND_SL || opcode == ZEND_SR
|| opcode == ZEND_BW_OR || opcode == ZEND_BW_AND || opcode == ZEND_BW_XOR)) {
return 0;
}
/* While basic arithmetic operators always produce numeric string errors,
* bitwise operators don't produce errors if both operands are strings */
if ((opcode == ZEND_BW_OR || opcode == ZEND_BW_AND || opcode == ZEND_BW_XOR)
&& Z_TYPE_P(op1) == IS_STRING && Z_TYPE_P(op2) == IS_STRING) {
return 0;
}
if (Z_TYPE_P(op1) == IS_STRING
&& !is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), NULL, NULL, 0)) {
return 1;
}
if (Z_TYPE_P(op2) == IS_STRING
&& !is_numeric_string(Z_STRVAL_P(op2), Z_STRLEN_P(op2), NULL, NULL, 0)) {
return 1;
}
return 0;
}
/* }}} */
static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode, zval *op1, zval *op2) /* {{{ */
{
binary_op_type fn = get_binary_op(opcode);
@@ -6250,6 +6279,11 @@ static inline zend_bool zend_try_ct_eval_binary_op(zval *result, uint32_t opcode
return 0;
}
/* don't evaluate numeric string error-producing operations at compile-time */
if (zend_binary_op_produces_numeric_string_error(opcode, op1, op2)) {
return 0;
}
fn(result, op1, op2);
return 1;
}
@@ -6262,11 +6296,11 @@ static inline void zend_ct_eval_unary_op(zval *result, uint32_t opcode, zval *op
}
/* }}} */
static inline void zend_ct_eval_unary_pm(zval *result, zend_ast_kind kind, zval *op) /* {{{ */
static inline zend_bool zend_try_ct_eval_unary_pm(zval *result, zend_ast_kind kind, zval *op) /* {{{ */
{
zval left;
ZVAL_LONG(&left, (kind == ZEND_AST_UNARY_PLUS) ? 1 : -1);
mul_function(result, &left, op);
return zend_try_ct_eval_binary_op(result, ZEND_MUL, &left, op);
}
/* }}} */
@@ -6464,10 +6498,11 @@ void zend_compile_unary_pm(znode *result, zend_ast *ast) /* {{{ */
zend_compile_expr(&expr_node, expr_ast);
if (expr_node.op_type == IS_CONST) {
result->op_type = IS_CONST;
zend_ct_eval_unary_pm(&result->u.constant, ast->kind, &expr_node.u.constant);
zval_ptr_dtor(&expr_node.u.constant);
return;
if (zend_try_ct_eval_unary_pm(&result->u.constant, ast->kind, &expr_node.u.constant)) {
result->op_type = IS_CONST;
zval_ptr_dtor(&expr_node.u.constant);
return;
}
}
lefthand_node.op_type = IS_CONST;
@@ -7802,7 +7837,9 @@ void zend_eval_const_expr(zend_ast **ast_ptr) /* {{{ */
return;
}
zend_ct_eval_unary_pm(&result, ast->kind, zend_ast_get_zval(ast->child[0]));
if (!zend_try_ct_eval_unary_pm(&result, ast->kind, zend_ast_get_zval(ast->child[0]))) {
return;
}
break;
case ZEND_AST_CONDITIONAL:
{

View File

@@ -1023,6 +1023,8 @@ END_EXTERN_C()
/* The default value for CG(compiler_options) during eval() */
#define ZEND_COMPILE_DEFAULT_FOR_EVAL 0
ZEND_API zend_bool zend_binary_op_produces_numeric_string_error(uint32_t opcode, zval *op1, zval *op2);
#endif /* ZEND_COMPILE_H */
/*

View File

@@ -147,7 +147,7 @@ static zend_always_inline void zend_unwrap_reference(zval *op) /* {{{ */
}
/* }}} */
ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
void ZEND_FASTCALL _convert_scalar_to_number(zval *op, zend_bool silent) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -159,8 +159,11 @@ try_again:
zend_string *str;
str = Z_STR_P(op);
if ((Z_TYPE_INFO_P(op)=is_numeric_string(ZSTR_VAL(str), ZSTR_LEN(str), &Z_LVAL_P(op), &Z_DVAL_P(op), 1)) == 0) {
if ((Z_TYPE_INFO_P(op)=is_numeric_string(ZSTR_VAL(str), ZSTR_LEN(str), &Z_LVAL_P(op), &Z_DVAL_P(op), silent ? 1 : -1)) == 0) {
ZVAL_LONG(op, 0);
if (!silent) {
zend_error(E_WARNING, "A non-numeric value encountered");
}
}
zend_string_release(str);
break;
@@ -186,18 +189,27 @@ try_again:
}
/* }}} */
ZEND_API void ZEND_FASTCALL convert_scalar_to_number(zval *op) /* {{{ */
{
_convert_scalar_to_number(op, 1);
}
/* }}} */
/* {{{ zendi_convert_scalar_to_number */
#define zendi_convert_scalar_to_number(op, holder, result) \
#define zendi_convert_scalar_to_number(op, holder, result, silent) \
if (op==result) { \
if (Z_TYPE_P(op) != IS_LONG) { \
convert_scalar_to_number(op); \
_convert_scalar_to_number(op, silent); \
} \
} else { \
switch (Z_TYPE_P(op)) { \
case IS_STRING: \
{ \
if ((Z_TYPE_INFO(holder)=is_numeric_string(Z_STRVAL_P(op), Z_STRLEN_P(op), &Z_LVAL(holder), &Z_DVAL(holder), 1)) == 0) { \
if ((Z_TYPE_INFO(holder)=is_numeric_string(Z_STRVAL_P(op), Z_STRLEN_P(op), &Z_LVAL(holder), &Z_DVAL(holder), silent ? 1 : -1)) == 0) { \
ZVAL_LONG(&(holder), 0); \
if (!silent) { \
zend_error(E_WARNING, "A non-numeric value encountered"); \
} \
} \
(op) = &(holder); \
break; \
@@ -258,7 +270,7 @@ try_again:
} \
} \
ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(op, op_func); \
op1_lval = _zval_get_long_func(op1); \
op1_lval = _zval_get_long_func_noisy(op1); \
} else { \
op1_lval = Z_LVAL_P(op1); \
} \
@@ -273,7 +285,7 @@ try_again:
} \
} \
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(op); \
op2_lval = _zval_get_long_func(op2); \
op2_lval = _zval_get_long_func_noisy(op2); \
} else { \
op2_lval = Z_LVAL_P(op2); \
} \
@@ -313,8 +325,11 @@ try_again:
case IS_STRING:
{
zend_string *str = Z_STR_P(op);
ZVAL_LONG(op, ZEND_STRTOL(ZSTR_VAL(str), NULL, base));
if (base == 10) {
ZVAL_LONG(op, zval_get_long(op));
} else {
ZVAL_LONG(op, ZEND_STRTOL(ZSTR_VAL(str), NULL, base));
}
zend_string_release(str);
}
break;
@@ -728,7 +743,7 @@ ZEND_API void multi_convert_to_string_ex(int argc, ...) /* {{{ */
}
/* }}} */
ZEND_API zend_long ZEND_FASTCALL _zval_get_long_func(zval *op) /* {{{ */
static zend_always_inline zend_long ZEND_FASTCALL _zval_get_long_func_ex(zval *op, zend_bool silent) /* {{{ */
{
try_again:
switch (Z_TYPE_P(op)) {
@@ -744,7 +759,26 @@ try_again:
case IS_DOUBLE:
return zend_dval_to_lval(Z_DVAL_P(op));
case IS_STRING:
return ZEND_STRTOL(Z_STRVAL_P(op), NULL, 10);
{
zend_uchar type;
zend_long lval;
double dval;
if (0 == (type = is_numeric_string(Z_STRVAL_P(op), Z_STRLEN_P(op), &lval, &dval, silent ? 1 : -1))) {
if (!silent) {
zend_error(E_WARNING, "A non-numeric value encountered");
}
return 0;
} else if (EXPECTED(type == IS_LONG)) {
return lval;
} else {
/* Previously we used strtol here, not is_numeric_string,
* and strtol gives you LONG_MAX/_MIN on overflow.
* We use use saturating conversion to emulate strtol()'s
* behaviour.
*/
return zend_dval_to_lval_cap(dval);
}
}
case IS_ARRAY:
return zend_hash_num_elements(Z_ARRVAL_P(op)) ? 1 : 0;
case IS_OBJECT:
@@ -766,6 +800,18 @@ try_again:
}
/* }}} */
ZEND_API zend_long ZEND_FASTCALL _zval_get_long_func(zval *op) /* {{{ */
{
return _zval_get_long_func_ex(op, 1);
}
/* }}} */
static zend_long ZEND_FASTCALL _zval_get_long_func_noisy(zval *op) /* {{{ */
{
return _zval_get_long_func_ex(op, 0);
}
/* }}} */
ZEND_API double ZEND_FASTCALL _zval_get_double_func(zval *op) /* {{{ */
{
try_again:
@@ -916,8 +962,8 @@ ZEND_API int ZEND_FASTCALL add_function(zval *result, zval *op1, zval *op2) /* {
} else if (!converted) {
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD, add_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
converted = 1;
} else {
zend_throw_error(NULL, "Unsupported operand types");
@@ -969,8 +1015,8 @@ ZEND_API int ZEND_FASTCALL sub_function(zval *result, zval *op1, zval *op2) /* {
} else if (!converted) {
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB, sub_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
converted = 1;
} else {
zend_throw_error(NULL, "Unsupported operand types");
@@ -1016,8 +1062,8 @@ ZEND_API int ZEND_FASTCALL mul_function(zval *result, zval *op1, zval *op2) /* {
} else if (!converted) {
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL, mul_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
converted = 1;
} else {
zend_throw_error(NULL, "Unsupported operand types");
@@ -1098,13 +1144,13 @@ ZEND_API int ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2) /* {
ZVAL_LONG(result, 0);
return SUCCESS;
} else {
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
}
if (Z_TYPE_P(op2) == IS_ARRAY) {
ZVAL_LONG(result, 1L);
return SUCCESS;
} else {
zendi_convert_scalar_to_number(op2, op2_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
}
converted = 1;
} else {
@@ -1169,8 +1215,8 @@ ZEND_API int ZEND_FASTCALL div_function(zval *result, zval *op1, zval *op2) /* {
} else if (!converted) {
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV, div_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
zendi_convert_scalar_to_number(op1, op1_copy, result, 0);
zendi_convert_scalar_to_number(op2, op2_copy, result, 0);
converted = 1;
} else {
zend_throw_error(NULL, "Unsupported operand types");
@@ -1377,13 +1423,13 @@ ZEND_API int ZEND_FASTCALL bitwise_or_function(zval *result, zval *op1, zval *op
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_OR, bitwise_or_function);
op1_lval = _zval_get_long_func(op1);
op1_lval = _zval_get_long_func_noisy(op1);
} else {
op1_lval = Z_LVAL_P(op1);
}
if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_OR);
op2_lval = _zval_get_long_func(op2);
op2_lval = _zval_get_long_func_noisy(op2);
} else {
op2_lval = Z_LVAL_P(op2);
}
@@ -1444,13 +1490,13 @@ ZEND_API int ZEND_FASTCALL bitwise_and_function(zval *result, zval *op1, zval *o
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_AND, bitwise_and_function);
op1_lval = _zval_get_long_func(op1);
op1_lval = _zval_get_long_func_noisy(op1);
} else {
op1_lval = Z_LVAL_P(op1);
}
if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_AND);
op2_lval = _zval_get_long_func(op2);
op2_lval = _zval_get_long_func_noisy(op2);
} else {
op2_lval = Z_LVAL_P(op2);
}
@@ -1511,13 +1557,13 @@ ZEND_API int ZEND_FASTCALL bitwise_xor_function(zval *result, zval *op1, zval *o
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_XOR, bitwise_xor_function);
op1_lval = _zval_get_long_func(op1);
op1_lval = _zval_get_long_func_noisy(op1);
} else {
op1_lval = Z_LVAL_P(op1);
}
if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_XOR);
op2_lval = _zval_get_long_func(op2);
op2_lval = _zval_get_long_func_noisy(op2);
} else {
op2_lval = Z_LVAL_P(op2);
}
@@ -1944,8 +1990,8 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
ZVAL_LONG(result, zval_is_true(op1) ? 0 : -1);
return SUCCESS;
} else {
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
zendi_convert_scalar_to_number(op1, op1_copy, result, 1);
zendi_convert_scalar_to_number(op2, op2_copy, result, 1);
converted = 1;
}
} else if (Z_TYPE_P(op1)==IS_ARRAY) {

View File

@@ -122,6 +122,16 @@ static zend_always_inline zend_long zend_dval_to_lval(double d)
return (zend_long)d;
}
#endif
static zend_always_inline zend_long zend_dval_to_lval_cap(double d)
{
if (UNEXPECTED(!zend_finite(d)) || UNEXPECTED(zend_isnan(d))) {
return 0;
} else if (!ZEND_DOUBLE_FITS_LONG(d)) {
return (d > 0 ? ZEND_LONG_MAX : ZEND_LONG_MIN);
}
return (zend_long)d;
}
/* }}} */
#define ZEND_IS_DIGIT(c) ((c) >= '0' && (c) <= '9')

View File

@@ -403,7 +403,7 @@ file_check_mem(struct magic_set *ms, unsigned int level)
size_t len;
if (level >= ms->c.len) {
len = (ms->c.len += 20 + level) * sizeof(*ms->c.li);
len = (ms->c.len = 20 + level) * sizeof(*ms->c.li);
ms->c.li = CAST(struct level_info *, (ms->c.li == NULL) ?
emalloc(len) :
erealloc(ms->c.li, len));

View File

@@ -1,11 +1,14 @@
--TEST--
Bug #68996 (Invalid free of CG(interned_empty_string))
--SKIPIF--
<?php
if (getenv("USE_ZEND_ALLOC") !== "0") {
print "skip Need Zend MM disabled";
}
?>
<?php require_once(dirname(__FILE__) . '/skipif.inc'); ?>
--INI--
html_errors=1
--ENV--
USE_ZEND_ALLOC=0
--FILE--
<?php
finfo_open(FILEINFO_MIME_TYPE, "\xfc\x63");

View File

@@ -683,9 +683,14 @@ optimize_constant_binary_op:
} else if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR) &&
zval_get_long(&ZEND_OP2_LITERAL(opline)) < 0) {
SET_VAR_SOURCE(opline);
opline++;
continue;
} else if (zend_binary_op_produces_numeric_string_error(opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline))) {
SET_VAR_SOURCE(opline);
opline++;
continue;
}
printf("%d\n", opline->opcode);
er = EG(error_reporting);
EG(error_reporting) = 0;
if (binary_op(&result, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) {

View File

@@ -84,6 +84,9 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
zval_get_long(&ZEND_OP2_LITERAL(opline)) < 0) {
/* shift by negative number */
break;
} else if (zend_binary_op_produces_numeric_string_error(opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline))) {
/* produces numeric string E_NOTICE/E_WARNING */
break;
}
er = EG(error_reporting);
EG(error_reporting) = 0;

View File

@@ -48,7 +48,10 @@ void zend_optimizer_pass2(zend_op_array *op_array)
case ZEND_POW:
if (ZEND_OP1_TYPE(opline) == IS_CONST) {
if (Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING) {
convert_scalar_to_number(&ZEND_OP1_LITERAL(opline));
/* don't optimise if it should produce a runtime numeric string error */
if (is_numeric_string(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)), NULL, NULL, 0)) {
convert_scalar_to_number(&ZEND_OP1_LITERAL(opline));
}
}
}
/* break missing *intentionally* - the assign_op's may only optimize op2 */
@@ -63,7 +66,10 @@ void zend_optimizer_pass2(zend_op_array *op_array)
}
if (ZEND_OP2_TYPE(opline) == IS_CONST) {
if (Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING) {
convert_scalar_to_number(&ZEND_OP2_LITERAL(opline));
/* don't optimise if it should produce a runtime numeric string error */
if (is_numeric_string(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)), NULL, NULL, 0)) {
convert_scalar_to_number(&ZEND_OP2_LITERAL(opline));
}
}
}
break;
@@ -73,7 +79,11 @@ void zend_optimizer_pass2(zend_op_array *op_array)
case ZEND_SR:
if (ZEND_OP1_TYPE(opline) == IS_CONST) {
if (Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_LONG) {
convert_to_long(&ZEND_OP1_LITERAL(opline));
/* don't optimise if it should produce a runtime numeric string error */
if (!(Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING
&& !is_numeric_string(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)), NULL, NULL, 0))) {
convert_to_long(&ZEND_OP1_LITERAL(opline));
}
}
}
/* break missing *intentionally - the assign_op's may only optimize op2 */
@@ -86,7 +96,11 @@ void zend_optimizer_pass2(zend_op_array *op_array)
}
if (ZEND_OP2_TYPE(opline) == IS_CONST) {
if (Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_LONG) {
convert_to_long(&ZEND_OP2_LITERAL(opline));
/* don't optimise if it should produce a runtime numeric string error */
if (!(Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING
&& !is_numeric_string(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)), NULL, NULL, 0))) {
convert_to_long(&ZEND_OP2_LITERAL(opline));
}
}
}
break;

View File

@@ -260,6 +260,8 @@ static void zend_analyze_recursion(zend_call_graph *call_graph)
call_info = call_info->next_caller;
}
}
free_alloca(visited, use_heap);
}
static void zend_sort_op_arrays(zend_call_graph *call_graph)

View File

@@ -203,6 +203,7 @@ PHP_FUNCTION(shmop_open)
}
if (shmctl(shmop->shmid, IPC_STAT, &shm)) {
/* please do not add coverage here: the segment would be leaked and impossible to delete via php */
php_error_docref(NULL, E_WARNING, "unable to get shared memory segment information '%s'", strerror(errno));
goto err;
}

View File

@@ -1,33 +0,0 @@
--TEST--
shmop extension error messages (non-root)
--SKIPIF--
<?php
if( substr(PHP_OS, 0, 3) == "WIN") {
die('skip not for Windows');
}
if (!extension_loaded("shmop")) {
die("skip shmop extension not available");
}
if (!extension_loaded("posix")) {
die("skip posix extension not available");
}
if (!posix_geteuid()) {
die("skip cannot run test as root");
}
?>
--FILE--
<?php
$hex_shm_id = function(){
return mt_rand(1338, 9999);
};
echo '## shmop_open function tests ##', PHP_EOL;
// warning outputs: unable to get shared memory segment information
var_dump(shmop_open($hex_shm_id(), 'n', 0, 1024));
?>
--EXPECTF--
## shmop_open function tests ##
Warning: shmop_open(): unable to get shared memory segment information 'Permission denied' in %s on line %d
bool(false)

View File

@@ -82,18 +82,18 @@ static inline spl_array_object *spl_array_from_obj(zend_object *obj) /* {{{ */ {
#define Z_SPLARRAY_P(zv) spl_array_from_obj(Z_OBJ_P((zv)))
static inline HashTable *spl_array_get_hash_table(spl_array_object* intern) { /* {{{ */
static inline HashTable **spl_array_get_hash_table_ptr(spl_array_object* intern) { /* {{{ */
//??? TODO: Delay duplication for arrays; only duplicate for write operations
if (intern->ar_flags & SPL_ARRAY_IS_SELF) {
if (!intern->std.properties) {
rebuild_object_properties(&intern->std);
}
return intern->std.properties;
return &intern->std.properties;
} else if (intern->ar_flags & SPL_ARRAY_USE_OTHER) {
spl_array_object *other = Z_SPLARRAY_P(&intern->array);
return spl_array_get_hash_table(other);
return spl_array_get_hash_table_ptr(other);
} else if (Z_TYPE(intern->array) == IS_ARRAY) {
return Z_ARRVAL(intern->array);
return &Z_ARRVAL(intern->array);
} else {
zend_object *obj = Z_OBJ(intern->array);
if (!obj->properties) {
@@ -104,9 +104,22 @@ static inline HashTable *spl_array_get_hash_table(spl_array_object* intern) { /*
}
obj->properties = zend_array_dup(obj->properties);
}
return obj->properties;
return &obj->properties;
}
} /* }}} */
}
/* }}} */
static inline HashTable *spl_array_get_hash_table(spl_array_object* intern) { /* {{{ */
return *spl_array_get_hash_table_ptr(intern);
}
/* }}} */
static inline void spl_array_replace_hash_table(spl_array_object* intern, HashTable *ht) { /* {{{ */
HashTable **ht_ptr = spl_array_get_hash_table_ptr(intern);
zend_array_destroy(*ht_ptr);
*ht_ptr = ht;
}
/* }}} */
static inline zend_bool spl_array_is_object(spl_array_object *intern) /* {{{ */
{
@@ -1432,16 +1445,12 @@ static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, int fnam
spl_array_object *intern = Z_SPLARRAY_P(getThis());
HashTable *aht = spl_array_get_hash_table(intern);
zval function_name, params[2], *arg = NULL;
uint32_t old_refcount;
ZVAL_STRINGL(&function_name, fname, fname_len);
/* A tricky way to pass "aht" by reference, reset refcount */
//??? It may be not safe, if user comparison handler accesses "aht"
old_refcount = GC_REFCOUNT(aht);
GC_REFCOUNT(aht) = 1;
ZVAL_NEW_EMPTY_REF(&params[0]);
ZVAL_ARR(Z_REFVAL(params[0]), aht);
GC_REFCOUNT(aht)++;
if (!use_arg) {
intern->nApplyCount++;
@@ -1470,10 +1479,16 @@ static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, int fnam
}
exit:
/* A tricky way to pass "aht" by reference, copy back and cleanup */
GC_REFCOUNT(aht) = old_refcount;
efree(Z_REF(params[0]));
zend_string_free(Z_STR(function_name));
{
HashTable *new_ht = Z_ARRVAL_P(Z_REFVAL(params[0]));
if (aht != new_ht) {
spl_array_replace_hash_table(intern, new_ht);
} else {
GC_REFCOUNT(aht)--;
}
efree(Z_REF(params[0]));
zend_string_free(Z_STR(function_name));
}
} /* }}} */
#define SPL_ARRAY_METHOD(cname, fname, use_arg) \

View File

@@ -1029,38 +1029,31 @@ static int php_array_user_compare(const void *a, const void *b) /* {{{ */
static void php_usort(INTERNAL_FUNCTION_PARAMETERS, compare_func_t compare_func, zend_bool renumber) /* {{{ */
{
zval *array;
zend_refcounted *arr;
zend_array *arr;
zend_bool retval;
PHP_ARRAY_CMP_FUNC_VARS;
PHP_ARRAY_CMP_FUNC_BACKUP();
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/f", &array, &BG(user_compare_fci), &BG(user_compare_fci_cache)) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "af", &array, &BG(user_compare_fci), &BG(user_compare_fci_cache)) == FAILURE) {
PHP_ARRAY_CMP_FUNC_RESTORE();
return;
}
/* Increase reference counter, so the attempts to modify the array in user
* comparison function will create a copy of array and won't affect the
* original array. The fact of modification is detected by comparing the
* zend_array pointer. The result of sorting in such case is undefined and
* the function returns FALSE.
*/
Z_ADDREF_P(array);
arr = Z_COUNTED_P(array);
retval = zend_hash_sort(Z_ARRVAL_P(array), compare_func, renumber) != FAILURE;
if (arr != Z_COUNTED_P(array)) {
php_error_docref(NULL, E_WARNING, "Array was modified by the user comparison function");
if (--GC_REFCOUNT(arr) <= 0) {
_zval_dtor_func(arr ZEND_FILE_LINE_CC);
}
retval = 0;
} else {
Z_DELREF_P(array);
arr = Z_ARR_P(array);
if (zend_hash_num_elements(arr) == 0) {
PHP_ARRAY_CMP_FUNC_RESTORE();
RETURN_TRUE;
}
/* Copy array, so the in-place modifications will not be visible to the callback function */
arr = zend_array_dup(arr);
retval = zend_hash_sort(arr, compare_func, renumber) != FAILURE;
zval_ptr_dtor(array);
ZVAL_ARR(array, arr);
PHP_ARRAY_CMP_FUNC_RESTORE();
RETURN_BOOL(retval);
}

View File

@@ -0,0 +1,38 @@
--TEST--
Bug #71334: Cannot access array keys while uksort()
--FILE--
<?php
class myClass
{
private $a = [
'foo-test' => [1],
'-' => [2],
'bar-test' => [3]
];
private function _mySort($x, $y)
{
if (!isset($this->a[$x])) {
throw new Exception('Missing X: "' . $x . '"');
}
if (!isset($this->a[$y])) {
throw new Exception('Missing Y: "' . $y . '"');
}
return $x < $y;
}
public function __construct()
{
uksort($this->a, [$this, '_mySort']);
}
}
new myClass();
echo "Done";
?>
--EXPECT--
Done

View File

@@ -4,7 +4,7 @@ Crash when function parameter modified via reference
<?php
function usercompare($a,$b) {
unset($GLOBALS['my_var'][2]);
return 0;
return $a <=> $b;
}
$my_var = array(1 => "entry_1",
2 => "entry_2",
@@ -12,10 +12,19 @@ $my_var = array(1 => "entry_1",
4 => "entry_4",
5 => "entry_5");
usort($my_var, "usercompare");
var_dump($my_var);
echo "Done.\n";
?>
--EXPECTF--
Warning: usort(): Array was modified by the user comparison function in %s on line %d
Done.
--EXPECT--
array(5) {
[0]=>
string(7) "entry_1"
[1]=>
string(7) "entry_2"
[2]=>
string(7) "entry_3"
[3]=>
string(7) "entry_4"
[4]=>
string(7) "entry_5"
}

View File

@@ -0,0 +1,33 @@
--TEST--
Crash when function parameter modified via reference while keeping orig refcount
--FILE--
<?php
$array = array(
1 => "entry_1",
2 => "entry_2",
3 => "entry_3",
4 => "entry_4",
5 => "entry_5"
);
usort($array, function($a, $b) use (&$array, &$ref) {
unset($array[2]);
$ref = $array;
return $a <=> $b;
});
var_dump($array);
?>
--EXPECT--
array(5) {
[0]=>
string(7) "entry_1"
[1]=>
string(7) "entry_2"
[2]=>
string(7) "entry_3"
[3]=>
string(7) "entry_4"
[4]=>
string(7) "entry_5"
}

View File

@@ -51,10 +51,10 @@ for($i = 0; $i<count($allDirs); $i++) {
$j = $i+1;
$dir = $allDirs[$i];
echo "\n-- Iteration $j --\n";
$res = file_put_contents($dir."/".$filename, ($data + $i));
$res = file_put_contents($dir."/".$filename, ($data . $i));
if ($res !== false) {
$in = file_get_contents($absFile);
if ($in == ($data + $i)) {
if ($in == ($data . $i)) {
echo "Data written correctly\n";
}
else {
@@ -116,4 +116,4 @@ Data written correctly
Warning: file_put_contents(BADDIR/FileGetContentsVar7.tmp): failed to open stream: %s in %s on line %d
No data written
*** Done ***
*** Done ***

View File

@@ -155,6 +155,10 @@ float(5000000)
float(-5000000)
*** Testing floatval() on non floating types ***
Notice: A non well formed numeric value encountered in %s on line 69
Notice: A non well formed numeric value encountered in %s on line 70
float(-2147483648)
float(2147483648)
float(%d)

View File

@@ -52,6 +52,11 @@ foreach ($not_float_types as $key => $type ) {
?>
===DONE===
--EXPECTF--
Notice: A non well formed numeric value encountered in %s on line %d
Notice: A non well formed numeric value encountered in %s on line %d
*** Testing floatval() on non floating types ***
-- Iteration : -2147483648 --
@@ -151,4 +156,4 @@ float(0)
-- Iteration : null --
float(0)
===DONE===
===DONE===

View File

@@ -282,7 +282,7 @@ string(7) "integer"
-- Iteration 18 --
string(6) "string"
bool(true)
int(1)
int(100)
string(7) "integer"
-- Iteration 19 --
string(6) "string"
@@ -297,7 +297,7 @@ string(7) "integer"
-- Iteration 21 --
string(6) "string"
bool(true)
int(-1)
int(0)
string(7) "integer"
-- Iteration 22 --
string(6) "string"
@@ -312,7 +312,7 @@ string(7) "integer"
-- Iteration 24 --
string(6) "string"
bool(true)
int(1)
int(100)
string(7) "integer"
-- Iteration 25 --
string(6) "string"
@@ -327,7 +327,7 @@ string(7) "integer"
-- Iteration 27 --
string(6) "string"
bool(true)
int(-1)
int(0)
string(7) "integer"
-- Iteration 28 --
string(6) "string"
@@ -687,7 +687,7 @@ string(7) "integer"
-- Iteration 18 --
string(6) "string"
bool(true)
int(1)
int(100)
string(7) "integer"
-- Iteration 19 --
string(6) "string"
@@ -702,7 +702,7 @@ string(7) "integer"
-- Iteration 21 --
string(6) "string"
bool(true)
int(-1)
int(0)
string(7) "integer"
-- Iteration 22 --
string(6) "string"
@@ -717,7 +717,7 @@ string(7) "integer"
-- Iteration 24 --
string(6) "string"
bool(true)
int(1)
int(100)
string(7) "integer"
-- Iteration 25 --
string(6) "string"
@@ -732,7 +732,7 @@ string(7) "integer"
-- Iteration 27 --
string(6) "string"
bool(true)
int(-1)
int(0)
string(7) "integer"
-- Iteration 28 --
string(6) "string"

View File

@@ -31,7 +31,7 @@ string(2) "11"
string(7) "1011111"
string(4) "1010"
string(12) "111101101110"
string(2) "11"
string(12) "111101101110"
string(6) "100111"
string(1) "0"
string(1) "1"

View File

@@ -30,7 +30,7 @@ string(1) "3"
string(2) "5f"
string(1) "a"
string(3) "f6e"
string(1) "3"
string(3) "f6e"
string(2) "27"
string(1) "0"
string(1) "1"

View File

@@ -30,7 +30,7 @@ string(1) "3"
string(3) "137"
string(2) "12"
string(4) "7556"
string(1) "3"
string(4) "7556"
string(2) "47"
string(1) "0"
string(1) "1"

View File

@@ -143,21 +143,31 @@ int(1)
int(0)
-- Iteration 17 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 18 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 19 --
int(0)
-- Iteration 20 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 21 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 22 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 23 --

View File

@@ -143,21 +143,31 @@ int(1)
int(0)
-- Iteration 17 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 18 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 19 --
int(0)
-- Iteration 20 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 21 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 22 --
Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 23 --

View File

@@ -139,21 +139,31 @@ float(20.3)
float(1)
-- Iteration 17 --
Warning: A non-numeric value encountered in %s on line %d
float(1)
-- Iteration 18 --
Warning: A non-numeric value encountered in %s on line %d
float(1)
-- Iteration 19 --
int(1)
-- Iteration 20 --
Warning: A non-numeric value encountered in %s on line %d
float(1)
-- Iteration 21 --
Warning: A non-numeric value encountered in %s on line %d
float(1)
-- Iteration 22 --
Warning: A non-numeric value encountered in %s on line %d
float(1)
-- Iteration 23 --

View File

@@ -41,6 +41,8 @@ array(1) {
[0]=>
string(0) ""
}
Warning: A non-numeric value encountered in %s on line %d
array(1) {
[0]=>
string(40) "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

View File

@@ -154,7 +154,7 @@ PHP_FUNCTION(intval)
ZEND_PARSE_PARAMETERS_END();
#endif
if (Z_TYPE_P(num) != IS_STRING) {
if (Z_TYPE_P(num) != IS_STRING || base == 10) {
RETVAL_LONG(zval_get_long(num));
} else {
RETVAL_LONG(ZEND_STRTOL(Z_STRVAL_P(num), NULL, base));

View File

@@ -7,11 +7,23 @@ Bug #28800 (Incorrect string to number conversion for strings starting with 'inf
echo ($v+0)."\n";
}
?>
--EXPECT--
0
0
0
0
0
--EXPECTF--
Warning: A non-numeric value encountered in %s on line %d
0
Warning: A non-numeric value encountered in %s on line %d
0
Warning: A non-numeric value encountered in %s on line %d
0
Warning: A non-numeric value encountered in %s on line %d
0
Warning: A non-numeric value encountered in %s on line %d
0
Warning: A non-numeric value encountered in %s on line %d
0

View File

@@ -226,17 +226,17 @@ int(984)
--- testing: '123abc' << 'a5.9' ---
int(123)
--- testing: '123e5' << '0' ---
int(123)
int(12300000)
--- testing: '123e5' << '65' ---
int(0)
--- testing: '123e5' << '-44' ---
Exception: Bit shift by negative number
--- testing: '123e5' << '1.2' ---
int(246)
int(24600000)
--- testing: '123e5' << '-7.7' ---
Exception: Bit shift by negative number
--- testing: '123e5' << 'abc' ---
int(123)
int(12300000)
--- testing: '123e5' << '123abc' ---
int(0)
--- testing: '123e5' << '123e5' ---
@@ -250,21 +250,21 @@ int(0)
--- testing: '123e5' << '123abc ' ---
int(0)
--- testing: '123e5' << '3.4a' ---
int(984)
int(98400000)
--- testing: '123e5' << 'a5.9' ---
int(123)
int(12300000)
--- testing: '123e5xyz' << '0' ---
int(123)
int(12300000)
--- testing: '123e5xyz' << '65' ---
int(0)
--- testing: '123e5xyz' << '-44' ---
Exception: Bit shift by negative number
--- testing: '123e5xyz' << '1.2' ---
int(246)
int(24600000)
--- testing: '123e5xyz' << '-7.7' ---
Exception: Bit shift by negative number
--- testing: '123e5xyz' << 'abc' ---
int(123)
int(12300000)
--- testing: '123e5xyz' << '123abc' ---
int(0)
--- testing: '123e5xyz' << '123e5' ---
@@ -278,9 +278,9 @@ int(0)
--- testing: '123e5xyz' << '123abc ' ---
int(0)
--- testing: '123e5xyz' << '3.4a' ---
int(984)
int(98400000)
--- testing: '123e5xyz' << 'a5.9' ---
int(123)
int(12300000)
--- testing: ' 123abc' << '0' ---
int(123)
--- testing: ' 123abc' << '65' ---

View File

@@ -222,17 +222,17 @@ int(15)
--- testing: '123abc' >> 'a5.9' ---
int(123)
--- testing: '123e5' >> '0' ---
int(123)
int(12300000)
--- testing: '123e5' >> '65' ---
int(0)
--- testing: '123e5' >> '-44' ---
Exception: Bit shift by negative number
--- testing: '123e5' >> '1.2' ---
int(61)
int(6150000)
--- testing: '123e5' >> '-7.7' ---
Exception: Bit shift by negative number
--- testing: '123e5' >> 'abc' ---
int(123)
int(12300000)
--- testing: '123e5' >> '123abc' ---
int(0)
--- testing: '123e5' >> '123e5' ---
@@ -246,21 +246,21 @@ int(0)
--- testing: '123e5' >> '123abc ' ---
int(0)
--- testing: '123e5' >> '3.4a' ---
int(15)
int(1537500)
--- testing: '123e5' >> 'a5.9' ---
int(123)
int(12300000)
--- testing: '123e5xyz' >> '0' ---
int(123)
int(12300000)
--- testing: '123e5xyz' >> '65' ---
int(0)
--- testing: '123e5xyz' >> '-44' ---
Exception: Bit shift by negative number
--- testing: '123e5xyz' >> '1.2' ---
int(61)
int(6150000)
--- testing: '123e5xyz' >> '-7.7' ---
Exception: Bit shift by negative number
--- testing: '123e5xyz' >> 'abc' ---
int(123)
int(12300000)
--- testing: '123e5xyz' >> '123abc' ---
int(0)
--- testing: '123e5xyz' >> '123e5' ---
@@ -274,9 +274,9 @@ int(0)
--- testing: '123e5xyz' >> '123abc ' ---
int(0)
--- testing: '123e5xyz' >> '3.4a' ---
int(15)
int(1537500)
--- testing: '123e5xyz' >> 'a5.9' ---
int(123)
int(12300000)
--- testing: ' 123abc' >> '0' ---
int(123)
--- testing: ' 123abc' >> '65' ---

View File

@@ -208,9 +208,9 @@ Exception: Modulo by zero
--- testing: '123abc' % '123abc' ---
int(0)
--- testing: '123abc' % '123e5' ---
int(0)
int(123)
--- testing: '123abc' % '123e5xyz' ---
int(0)
int(123)
--- testing: '123abc' % ' 123abc' ---
int(0)
--- testing: '123abc' % '123 abc' ---
@@ -224,13 +224,13 @@ Exception: Modulo by zero
--- testing: '123e5' % '0' ---
Exception: Modulo by zero
--- testing: '123e5' % '65' ---
int(58)
int(50)
--- testing: '123e5' % '-44' ---
int(35)
int(20)
--- testing: '123e5' % '1.2' ---
int(0)
--- testing: '123e5' % '-7.7' ---
int(4)
int(6)
--- testing: '123e5' % 'abc' ---
Exception: Modulo by zero
--- testing: '123e5' % '123abc' ---
@@ -252,13 +252,13 @@ Exception: Modulo by zero
--- testing: '123e5xyz' % '0' ---
Exception: Modulo by zero
--- testing: '123e5xyz' % '65' ---
int(58)
int(50)
--- testing: '123e5xyz' % '-44' ---
int(35)
int(20)
--- testing: '123e5xyz' % '1.2' ---
int(0)
--- testing: '123e5xyz' % '-7.7' ---
int(4)
int(6)
--- testing: '123e5xyz' % 'abc' ---
Exception: Modulo by zero
--- testing: '123e5xyz' % '123abc' ---
@@ -292,9 +292,9 @@ Exception: Modulo by zero
--- testing: ' 123abc' % '123abc' ---
int(0)
--- testing: ' 123abc' % '123e5' ---
int(0)
int(123)
--- testing: ' 123abc' % '123e5xyz' ---
int(0)
int(123)
--- testing: ' 123abc' % ' 123abc' ---
int(0)
--- testing: ' 123abc' % '123 abc' ---
@@ -320,9 +320,9 @@ Exception: Modulo by zero
--- testing: '123 abc' % '123abc' ---
int(0)
--- testing: '123 abc' % '123e5' ---
int(0)
int(123)
--- testing: '123 abc' % '123e5xyz' ---
int(0)
int(123)
--- testing: '123 abc' % ' 123abc' ---
int(0)
--- testing: '123 abc' % '123 abc' ---
@@ -348,9 +348,9 @@ Exception: Modulo by zero
--- testing: '123abc ' % '123abc' ---
int(0)
--- testing: '123abc ' % '123e5' ---
int(0)
int(123)
--- testing: '123abc ' % '123e5xyz' ---
int(0)
int(123)
--- testing: '123abc ' % ' 123abc' ---
int(0)
--- testing: '123abc ' % '123 abc' ---

View File

@@ -16,7 +16,7 @@ foreach ($strVals as $strVal) {
?>
===DONE===
--EXPECT--
--EXPECTF--
--- testing: '0' ---
int(0)
--- testing: '65' ---
@@ -28,21 +28,37 @@ float(-1.2)
--- testing: '-7.7' ---
float(7.7)
--- testing: 'abc' ---
Warning: A non-numeric value encountered in %s on line %d
int(0)
--- testing: '123abc' ---
Notice: A non well formed numeric value encountered in %s on line %d
int(-123)
--- testing: '123e5' ---
float(-12300000)
--- testing: '123e5xyz' ---
Notice: A non well formed numeric value encountered in %s on line %d
float(-12300000)
--- testing: ' 123abc' ---
Notice: A non well formed numeric value encountered in %s on line %d
int(-123)
--- testing: '123 abc' ---
Notice: A non well formed numeric value encountered in %s on line %d
int(-123)
--- testing: '123abc ' ---
Notice: A non well formed numeric value encountered in %s on line %d
int(-123)
--- testing: '3.4a' ---
Notice: A non well formed numeric value encountered in %s on line %d
float(-3.4)
--- testing: 'a5.9' ---
Warning: A non-numeric value encountered in %s on line %d
int(0)
===DONE===