Skip to content

zend_hash_sort always returns SUCCESS #3936

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions Zend/zend_hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -2459,7 +2459,7 @@ ZEND_API void zend_hash_bucket_packed_swap(Bucket *p, Bucket *q)
q->h = h;
}

ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, compare_func_t compar, zend_bool renumber)
ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, compare_func_t compar, zend_bool renumber)
{
Bucket *p;
uint32_t i, j;
Expand All @@ -2468,7 +2468,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
HT_ASSERT_RC1(ht);

if (!(ht->nNumOfElements>1) && !(renumber && ht->nNumOfElements>0)) { /* Doesn't require sorting */
return SUCCESS;
return;
}

if (HT_IS_WITHOUT_HOLES(ht)) {
Expand Down Expand Up @@ -2523,8 +2523,6 @@ ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, co
zend_hash_rehash(ht);
}
}

return SUCCESS;
}

static zend_always_inline int zend_hash_compare_impl(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered) {
Expand Down
2 changes: 1 addition & 1 deletion Zend/zend_hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ ZEND_API void zend_hash_bucket_swap(Bucket *p, Bucket *q);
ZEND_API void zend_hash_bucket_renum_swap(Bucket *p, Bucket *q);
ZEND_API void zend_hash_bucket_packed_swap(Bucket *p, Bucket *q);
ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered);
ZEND_API int ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, compare_func_t compare_func, zend_bool renumber);
ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, compare_func_t compare_func, zend_bool renumber);
ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t flag);

#define zend_hash_sort(ht, compare_func, renumber) \
Expand Down
8 changes: 2 additions & 6 deletions Zend/zend_ts_hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -264,15 +264,11 @@ ZEND_API void zend_ts_hash_merge_ex(TsHashTable *target, TsHashTable *source, co
end_read(source);
}

ZEND_API int zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, compare_func_t compare_func, int renumber)
ZEND_API void zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, compare_func_t compare_func, int renumber)
{
int retval;

begin_write(ht);
retval = zend_hash_sort_ex(TS_HASH(ht), sort_func, compare_func, renumber);
zend_hash_sort_ex(TS_HASH(ht), sort_func, compare_func, renumber);
end_write(ht);

return retval;
}

ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, zend_bool ordered)
Expand Down
2 changes: 1 addition & 1 deletion Zend/zend_ts_hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ ZEND_API void zend_ts_hash_copy(TsHashTable *target, TsHashTable *source, copy_c
ZEND_API void zend_ts_hash_copy_to_hash(HashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor);
ZEND_API void zend_ts_hash_merge(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, int overwrite);
ZEND_API void zend_ts_hash_merge_ex(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam);
ZEND_API int zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, compare_func_t compare_func, int renumber);
ZEND_API void zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, compare_func_t compare_func, int renumber);
ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, zend_bool ordered);
ZEND_API zval *zend_ts_hash_minmax(TsHashTable *ht, compare_func_t compar, int flag);

Expand Down
5 changes: 1 addition & 4 deletions ext/phar/dirstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,10 +285,7 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest) /* {{{ */

if (FAILURE != zend_hash_has_more_elements(data)) {
efree(dir);
if (zend_hash_sort(data, phar_compare_dir_name, 0) == FAILURE) {
FREE_HASHTABLE(data);
return NULL;
}
zend_hash_sort(data, phar_compare_dir_name, 0);
return php_stream_alloc(&phar_dir_ops, data, NULL, "r");
} else {
efree(dir);
Expand Down
43 changes: 16 additions & 27 deletions ext/standard/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,9 +708,8 @@ PHP_FUNCTION(krsort)

cmp = php_get_key_compare_func(sort_type, 1);

if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 0) == FAILURE) {
RETURN_FALSE;
}
zend_hash_sort(Z_ARRVAL_P(array), cmp, 0);

RETURN_TRUE;
}
/* }}} */
Expand All @@ -731,9 +730,8 @@ PHP_FUNCTION(ksort)

cmp = php_get_key_compare_func(sort_type, 0);

if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 0) == FAILURE) {
RETURN_FALSE;
}
zend_hash_sort(Z_ARRVAL_P(array), cmp, 0);

RETURN_TRUE;
}
/* }}} */
Expand Down Expand Up @@ -835,13 +833,9 @@ static void php_natsort(INTERNAL_FUNCTION_PARAMETERS, int fold_case) /* {{{ */
ZEND_PARSE_PARAMETERS_END();

if (fold_case) {
if (zend_hash_sort(Z_ARRVAL_P(array), php_array_natural_case_compare, 0) == FAILURE) {
return;
}
zend_hash_sort(Z_ARRVAL_P(array), php_array_natural_case_compare, 0);
} else {
if (zend_hash_sort(Z_ARRVAL_P(array), php_array_natural_compare, 0) == FAILURE) {
return;
}
zend_hash_sort(Z_ARRVAL_P(array), php_array_natural_compare, 0);
}

RETURN_TRUE;
Expand Down Expand Up @@ -880,9 +874,8 @@ PHP_FUNCTION(asort)

cmp = php_get_data_compare_func(sort_type, 0);

if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 0) == FAILURE) {
RETURN_FALSE;
}
zend_hash_sort(Z_ARRVAL_P(array), cmp, 0);

RETURN_TRUE;
}
/* }}} */
Expand All @@ -903,9 +896,8 @@ PHP_FUNCTION(arsort)

cmp = php_get_data_compare_func(sort_type, 1);

if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 0) == FAILURE) {
RETURN_FALSE;
}
zend_hash_sort(Z_ARRVAL_P(array), cmp, 0);

RETURN_TRUE;
}
/* }}} */
Expand All @@ -926,9 +918,8 @@ PHP_FUNCTION(sort)

cmp = php_get_data_compare_func(sort_type, 0);

if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 1) == FAILURE) {
RETURN_FALSE;
}
zend_hash_sort(Z_ARRVAL_P(array), cmp, 1);

RETURN_TRUE;
}
/* }}} */
Expand All @@ -949,9 +940,8 @@ PHP_FUNCTION(rsort)

cmp = php_get_data_compare_func(sort_type, 1);

if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 1) == FAILURE) {
RETURN_FALSE;
}
zend_hash_sort(Z_ARRVAL_P(array), cmp, 1);

RETURN_TRUE;
}
/* }}} */
Expand Down Expand Up @@ -1020,7 +1010,6 @@ static void php_usort(INTERNAL_FUNCTION_PARAMETERS, compare_func_t compare_func,
{
zval *array;
zend_array *arr;
zend_bool retval;
PHP_ARRAY_CMP_FUNC_VARS;

PHP_ARRAY_CMP_FUNC_BACKUP();
Expand All @@ -1039,13 +1028,13 @@ static void php_usort(INTERNAL_FUNCTION_PARAMETERS, compare_func_t compare_func,
/* 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;
zend_hash_sort(arr, compare_func, renumber);

zval_ptr_dtor(array);
ZVAL_ARR(array, arr);

PHP_ARRAY_CMP_FUNC_RESTORE();
RETURN_BOOL(retval);
RETURN_TRUE;
}
/* }}} */

Expand Down