Skip to content

Commit bfe7a11

Browse files
committed
Properly validate ArrayObject::asort() argument
1 parent 4fb5ccf commit bfe7a11

File tree

3 files changed

+13
-14
lines changed

3 files changed

+13
-14
lines changed

ext/spl/spl_array.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator;
5555
#define SPL_ARRAY_CLONE_MASK 0x0100FFFF
5656

5757
#define SPL_ARRAY_METHOD_NO_ARG 0
58-
#define SPL_ARRAY_METHOD_USE_ARG 1
59-
#define SPL_ARRAY_METHOD_MAY_USER_ARG 2
58+
#define SPL_ARRAY_METHOD_CALLBACK_ARG 1
59+
#define SPL_ARRAY_METHOD_SORT_FLAGS_ARG 2
6060

6161
typedef struct _spl_array_object {
6262
zval array;
@@ -1429,15 +1429,14 @@ static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, int fnam
14291429
intern->nApplyCount++;
14301430
call_user_function(EG(function_table), NULL, &function_name, return_value, 1, params);
14311431
intern->nApplyCount--;
1432-
} else if (use_arg == SPL_ARRAY_METHOD_MAY_USER_ARG) {
1433-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|z", &arg) == FAILURE) {
1432+
} else if (use_arg == SPL_ARRAY_METHOD_SORT_FLAGS_ARG) {
1433+
zend_long sort_flags = 0;
1434+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &sort_flags) == FAILURE) {
14341435
goto exit;
14351436
}
1436-
if (arg) {
1437-
ZVAL_COPY_VALUE(&params[1], arg);
1438-
}
1437+
ZVAL_LONG(&params[1], sort_flags);
14391438
intern->nApplyCount++;
1440-
call_user_function(EG(function_table), NULL, &function_name, return_value, arg ? 2 : 1, params);
1439+
call_user_function(EG(function_table), NULL, &function_name, return_value, 2, params);
14411440
intern->nApplyCount--;
14421441
} else {
14431442
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &arg) == FAILURE) {
@@ -1468,16 +1467,16 @@ PHP_METHOD(cname, fname) \
14681467
}
14691468

14701469
/* {{{ Sort the entries by values. */
1471-
SPL_ARRAY_METHOD(ArrayObject, asort, SPL_ARRAY_METHOD_MAY_USER_ARG) /* }}} */
1470+
SPL_ARRAY_METHOD(ArrayObject, asort, SPL_ARRAY_METHOD_SORT_FLAGS_ARG) /* }}} */
14721471

14731472
/* {{{ Sort the entries by key. */
1474-
SPL_ARRAY_METHOD(ArrayObject, ksort, SPL_ARRAY_METHOD_MAY_USER_ARG) /* }}} */
1473+
SPL_ARRAY_METHOD(ArrayObject, ksort, SPL_ARRAY_METHOD_SORT_FLAGS_ARG) /* }}} */
14751474

14761475
/* {{{ Sort the entries by values user defined function. */
1477-
SPL_ARRAY_METHOD(ArrayObject, uasort, SPL_ARRAY_METHOD_USE_ARG) /* }}} */
1476+
SPL_ARRAY_METHOD(ArrayObject, uasort, SPL_ARRAY_METHOD_CALLBACK_ARG) /* }}} */
14781477

14791478
/* {{{ Sort the entries by key using user defined function. */
1480-
SPL_ARRAY_METHOD(ArrayObject, uksort, SPL_ARRAY_METHOD_USE_ARG) /* }}} */
1479+
SPL_ARRAY_METHOD(ArrayObject, uksort, SPL_ARRAY_METHOD_CALLBACK_ARG) /* }}} */
14811480

14821481
/* {{{ Sort the entries by values using "natural order" algorithm. */
14831482
SPL_ARRAY_METHOD(ArrayObject, natsort, SPL_ARRAY_METHOD_NO_ARG) /* }}} */

ext/spl/tests/arrayObject_asort_basic1.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ object(ArrayObject)#%d (1) {
3636
int(4)
3737
}
3838
}
39-
asort(): Argument #2 ($flags) must be of type int, string given
39+
ArrayObject::asort(): Argument #1 ($flags) must be of type int, string given
4040
object(ArrayObject)#%d (1) {
4141
["storage":"ArrayObject":private]=>
4242
array(3) {

ext/spl/tests/arrayObject_ksort_basic1.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ object(ArrayObject)#%d (1) {
3535
int(3)
3636
}
3737
}
38-
ksort(): Argument #2 ($flags) must be of type int, string given
38+
ArrayObject::ksort(): Argument #1 ($flags) must be of type int, string given
3939
object(ArrayObject)#2 (1) {
4040
["storage":"ArrayObject":private]=>
4141
array(4) {

0 commit comments

Comments
 (0)