diff --git a/.github/actions/apt-x32/action.yml b/.github/actions/apt-x32/action.yml index 0638881d1e4c2..af1d7918bb28d 100644 --- a/.github/actions/apt-x32/action.yml +++ b/.github/actions/apt-x32/action.yml @@ -33,13 +33,11 @@ runs: libsodium-dev:i386 \ libsqlite3-dev:i386 \ libssl-dev:i386 \ - libtidy-dev:i386 \ libwebp-dev:i386 \ libxml2-dev:i386 \ libxml2-dev:i386 \ libxpm-dev:i386 \ libxslt1-dev:i386 \ - libzip-dev:i386 \ locales \ make \ pkg-config:i386 \ diff --git a/.github/actions/brew/action.yml b/.github/actions/brew/action.yml index 287062e6f9f9c..07595a5ada931 100644 --- a/.github/actions/brew/action.yml +++ b/.github/actions/brew/action.yml @@ -13,7 +13,7 @@ runs: # Some packages exist on x86 but not arm, or vice versa. # Install them with reinstall to avoid warnings. - brew reinstall autoconf webp tidy-html5 libzip libsodium icu4c + brew reinstall autoconf webp tidy-html5 libzip libsodium icu4c curl brew install \ bison \ re2c diff --git a/.github/actions/configure-macos/action.yml b/.github/actions/configure-macos/action.yml index ab92dfb2d782f..645efe9de3da8 100644 --- a/.github/actions/configure-macos/action.yml +++ b/.github/actions/configure-macos/action.yml @@ -18,6 +18,7 @@ runs: export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$BREW_OPT/libxslt/lib/pkgconfig" export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$BREW_OPT/zlib/lib/pkgconfig" export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$BREW_OPT/icu4c/lib/pkgconfig" + export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$BREW_OPT/openldap/lib/pkgconfig" ./buildconf --force ./configure \ --enable-option-checking=fatal \ diff --git a/.github/actions/configure-x32/action.yml b/.github/actions/configure-x32/action.yml index c07c49bb2c4f1..de500e02d4991 100644 --- a/.github/actions/configure-x32/action.yml +++ b/.github/actions/configure-x32/action.yml @@ -10,6 +10,7 @@ runs: run: | set -x + export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/i386-linux-gnu/pkgconfig" ./buildconf --force export CFLAGS="-m32 -msse2" export CXXFLAGS="-m32 -msse2" @@ -33,12 +34,10 @@ runs: --with-freetype \ --with-xpm \ --enable-exif \ - --with-zip \ --with-zlib \ --enable-soap \ --enable-xmlreader \ --with-xsl \ - --with-tidy \ --enable-sysvsem \ --enable-sysvshm \ --enable-shmop \ diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 684934c7073ee..07c27f80ccdf8 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,7 +1,7 @@ name: Push on: push: - paths-ignore: + paths-ignore: &paths-ignore - docs/** - NEWS - UPGRADING @@ -18,16 +18,7 @@ on: - PHP-8.4 - master pull_request: - paths-ignore: - - docs/** - - NEWS - - UPGRADING - - UPGRADING.INTERNALS - - '**/README.*' - - CONTRIBUTING.md - - CODING_STANDARDS.md - - .cirrus.yml - - .circleci/** + paths-ignore: *paths-ignore branches: - '**' workflow_dispatch: ~ @@ -78,7 +69,7 @@ jobs: zts: true asan: true name: "LINUX_X64_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || '' }}" - runs-on: ubuntu-${{ !matrix.asan && '22' || '24' }}.04 + runs-on: ubuntu-24.04 timeout-minutes: 50 steps: - name: git checkout @@ -142,7 +133,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 50 container: - image: ubuntu:20.04 + image: ubuntu:24.04 env: MYSQL_TEST_HOST: mysql PDO_MYSQL_TEST_DSN: mysql:host=mysql;dbname=test @@ -255,7 +246,7 @@ jobs: BENCHMARKING: name: BENCHMARKING if: github.repository == 'php/php-src' || github.event_name == 'pull_request' - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 timeout-minutes: 50 steps: - name: git checkout diff --git a/.github/workflows/root.yml b/.github/workflows/root.yml index f526e9bea30d5..cefabd0394a46 100644 --- a/.github/workflows/root.yml +++ b/.github/workflows/root.yml @@ -46,12 +46,17 @@ jobs: matrix: branch: ${{ fromJson(needs.GENERATE_MATRIX.outputs.branches) }} with: - asan_ubuntu_version: '20.04' + asan_ubuntu_version: ${{ + (((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 5) || matrix.branch.version[0] >= 9) && '24.04') + || '20.04' }} branch: ${{ matrix.branch.ref }} community_verify_type_inference: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9 }} libmysqlclient_with_mysqli: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] == 1) }} run_alpine: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9 }} run_macos_arm64: ${{ (matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9 }} - ubuntu_version: ${{ ((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 3) || matrix.branch.version[0] >= 9) && '22.04' || '20.04' }} + ubuntu_version: ${{ + (((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 5) || matrix.branch.version[0] >= 9) && '24.04') + || ((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 3) && '22.04') + || '20.04' }} windows_version: ${{ ((matrix.branch.version[0] == 8 && matrix.branch.version[1] >= 4) || matrix.branch.version[0] >= 9) && '2022' || '2019' }} secrets: inherit diff --git a/NEWS b/NEWS index a833bf4355ede..ee1fa5cd79802 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ PHP NEWS - DOM: . Added Dom\Element::$outerHTML. (nielsdos) + . Added Dom\Element::insertAdjacentHTML(). (nielsdos) - Output: . Fixed calculation of aligned buffer size. (cmb) @@ -36,10 +37,22 @@ PHP NEWS - Random: . Moves from /dev/urandom usage to arc4random_buf on Haiku. (David Carlier) +- Reflection: + . Added ReflectionConstant::getExtension() and ::getExtensionName(). + (DanielEScherzer) + - SOAP: . Fixed bug #49169 (SoapServer calls wrong function, although "SOAP action" header is correct). (nielsdos) +- Standard: + . Fixed crypt() tests on musl when using --with-external-libcrypt + (Michael Orlitzky). + +- Windows: + . Fixed bug GH-10992 (Improper long path support for relative paths). (cmb, + nielsdos) + - XMLWriter: . Improved performance and reduce memory consumption. (nielsdos) diff --git a/UPGRADING b/UPGRADING index 13e834f2610a3..6d6fa0030e603 100644 --- a/UPGRADING +++ b/UPGRADING @@ -92,6 +92,9 @@ PHP 8.5 UPGRADE NOTES attached to a CurlMultiHandle. This includes both handles added using curl_multi_add_handle() and handles accepted by CURLMOPT_PUSHFUNCTION. +- DOM: + . Added Dom\Element::insertAdjacentHTML(). + - PGSQL: . pg_close_stmt offers an alternative way to close a prepared statement from the DEALLOCATE sql command in that we can reuse @@ -99,6 +102,8 @@ PHP 8.5 UPGRADE NOTES - Reflection: . ReflectionConstant::getFileName() was introduced. + . ReflectionConstant::getExtension() and + ReflectionConstant::getExtensionName() were introduced. ======================================== 7. New Classes and Interfaces diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index 9206eb8e1638d..4d9a769f1de3a 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -504,11 +504,12 @@ ZEND_API zend_result zend_register_constant(zend_constant *c) name = c->name; } - zend_string *filename = zend_get_executed_filename_ex(); - if (filename == NULL) { - c->filename = NULL; - } else { - c->filename = zend_string_copy(filename); + c->filename = NULL; + if (ZEND_CONSTANT_MODULE_NUMBER(c) == PHP_USER_CONSTANT) { + zend_string *filename = zend_get_executed_filename_ex(); + if (filename) { + c->filename = zend_string_copy(filename); + } } /* Check if the user is trying to define any special constant */ diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h index e292d993219ca..9ab46f9b32cfe 100644 --- a/Zend/zend_portability.h +++ b/Zend/zend_portability.h @@ -515,6 +515,13 @@ extern "C++" { # undef HAVE_FUNC_ATTRIBUTE_IFUNC #endif +#if __has_feature(memory_sanitizer) +# include +# define MSAN_UNPOISON(value) __msan_unpoison(&(value), sizeof(value)) +#else +# define MSAN_UNPOISON(value) +#endif + /* Only use ifunc resolvers if we have __builtin_cpu_supports() and __builtin_cpu_init(), * otherwise the use of zend_cpu_supports() may not be safe inside ifunc resolvers. */ #if defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(HAVE_FUNC_ATTRIBUTE_TARGET) && \ diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c index 8115e041c0c3e..88b905ffeab40 100644 --- a/Zend/zend_strtod.c +++ b/Zend/zend_strtod.c @@ -3605,13 +3605,20 @@ rv_alloc(i) int i; rv_alloc(int i) #endif { - int k, *r; - size_t j = sizeof(ULong); + int j, k, *r; + size_t rem; + + rem = sizeof(Bigint) - sizeof(ULong) - sizeof(int); + + + j = sizeof(ULong); + if (i > ((INT_MAX >> 2) + rem)) + i = (INT_MAX >> 2) + rem; for(k = 0; - sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (size_t)i; - j <<= 1) + rem + j <= (size_t)i; j <<= 1) k++; + r = (int*)Balloc(k); *r = k; return diff --git a/build/genif.sh b/build/genif.sh index 697bef95912e4..f6d6fff953476 100755 --- a/build/genif.sh +++ b/build/genif.sh @@ -32,7 +32,7 @@ header_list= olddir=$(pwd) # Go to project root. -cd $(CDPATH= cd -- "$(dirname -- "$0")/../" && pwd -P) +cd "$(CDPATH='' cd -- "$(dirname -- "$0")/../" && pwd -P)" || exit module_ptrs="$(echo $extensions | $AWK -f ./build/order_by_dep.awk)" diff --git a/buildconf b/buildconf index 51ef423abcf2d..0586cbf0cd274 100755 --- a/buildconf +++ b/buildconf @@ -8,9 +8,9 @@ force=0 debug=0 # Go to project root. -cd $(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) +cd "$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd -P)" || exit -php_extra_version=$(grep '^AC_INIT(' configure.ac) +php_extra_version=$(grep '^AC_INIT(' configure.ac) || exit case "$php_extra_version" in *-dev*) dev=1 diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 677eaa8703af0..71cdf7937d99f 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1283,13 +1283,13 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source) ch->handlers.read->res = source->handlers.read->res; if (ZEND_FCC_INITIALIZED(source->handlers.read->fcc)) { - zend_fcc_dup(&source->handlers.read->fcc, &source->handlers.read->fcc); + zend_fcc_dup(&ch->handlers.read->fcc, &source->handlers.read->fcc); } if (ZEND_FCC_INITIALIZED(source->handlers.write->fcc)) { - zend_fcc_dup(&source->handlers.write->fcc, &source->handlers.write->fcc); + zend_fcc_dup(&ch->handlers.write->fcc, &source->handlers.write->fcc); } if (ZEND_FCC_INITIALIZED(source->handlers.write_header->fcc)) { - zend_fcc_dup(&source->handlers.write_header->fcc, &source->handlers.write_header->fcc); + zend_fcc_dup(&ch->handlers.write_header->fcc, &source->handlers.write_header->fcc); } curl_easy_setopt(ch->cp, CURLOPT_ERRORBUFFER, ch->err.str); diff --git a/ext/curl/tests/bug77535.phpt b/ext/curl/tests/bug77535.phpt index 522818516ae69..600bfef62b9aa 100644 --- a/ext/curl/tests/bug77535.phpt +++ b/ext/curl/tests/bug77535.phpt @@ -2,7 +2,7 @@ Bug #77535 (Invalid callback, h2 server push) --EXTENSIONS-- curl ---XLEAK-- +--XFAIL-- --SKIPIF-- --EXPECT-- +Trampoline for trampoline Array ( [0] => main response diff --git a/ext/curl/tests/curl_writeheader_tranpoline.phpt b/ext/curl/tests/curl_writeheader_trampoline.phpt similarity index 100% rename from ext/curl/tests/curl_writeheader_tranpoline.phpt rename to ext/curl/tests/curl_writeheader_trampoline.phpt diff --git a/ext/dl_test/dl_test.c b/ext/dl_test/dl_test.c index 33008a2b57205..04f013f64709f 100644 --- a/ext/dl_test/dl_test.c +++ b/ext/dl_test/dl_test.c @@ -94,6 +94,8 @@ PHP_MINIT_FUNCTION(dl_test) fprintf(stderr, "DL TEST MINIT\n"); } + register_dl_test_symbols(module_number); + return SUCCESS; } /* }}} */ diff --git a/ext/dl_test/dl_test.stub.php b/ext/dl_test/dl_test.stub.php index 524c8206365b8..2b1545175046c 100644 --- a/ext/dl_test/dl_test.stub.php +++ b/ext/dl_test/dl_test.stub.php @@ -8,3 +8,6 @@ function dl_test_test1(): void {} function dl_test_test2(string $str = ""): string {} + +/** @var int */ +const DL_TEST_CONST = 42; diff --git a/ext/dl_test/dl_test_arginfo.h b/ext/dl_test/dl_test_arginfo.h index 0b6627b19b009..276eae4ac7dce 100644 --- a/ext/dl_test/dl_test_arginfo.h +++ b/ext/dl_test/dl_test_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 547ddbc21e9aa853b491cb17e902bbbb9cc2df00 */ + * Stub hash: e1154d736a190512ecf51e30719d53e685ca5513 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dl_test_test1, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() @@ -16,3 +16,8 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(dl_test_test2, arginfo_dl_test_test2) ZEND_FE_END }; + +static void register_dl_test_symbols(int module_number) +{ + REGISTER_LONG_CONSTANT("DL_TEST_CONST", 42, CONST_PERSISTENT); +} diff --git a/ext/dom/element.c b/ext/dom/element.c index 418096312c456..e96f4547d8f3f 100644 --- a/ext/dom/element.c +++ b/ext/dom/element.c @@ -1715,6 +1715,98 @@ PHP_METHOD(Dom_Element, insertAdjacentText) } /* }}} end DOMElement::insertAdjacentText */ +/* https://html.spec.whatwg.org/#dom-element-insertadjacenthtml */ +PHP_METHOD(Dom_Element, insertAdjacentHTML) +{ + zval *where_zv; + zend_string *string; + + dom_object *this_intern; + zval *id; + xmlNodePtr thisp; + + bool created_context = false; + + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_OBJECT_OF_CLASS(where_zv, dom_adjacent_position_class_entry) + Z_PARAM_STR(string) + ZEND_PARSE_PARAMETERS_END(); + + DOM_GET_THIS_OBJ(thisp, id, xmlNodePtr, this_intern); + + const zend_string *where = Z_STR_P(zend_enum_fetch_case_name(Z_OBJ_P(where_zv))); + + /* 1. We don't do injection sinks. */ + + /* 2. Let context be NULL */ + xmlNodePtr context = NULL; + + /* 3. Use the first matching item from this list: (...) */ + switch (ZSTR_LEN(where) + ZSTR_VAL(where)[2]) { + case sizeof("BeforeBegin") - 1 + 'f': + case sizeof("AfterEnd") - 1 + 't': + /* 1. Set context to this's parent. */ + context = thisp->parent; + + /* 2. If context is null or a Document, throw a "NoModificationAllowedError" DOMException. */ + if (context == NULL || context->type == XML_DOCUMENT_NODE || context->type == XML_HTML_DOCUMENT_NODE) { + php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, true); + RETURN_THROWS(); + } + break; + case sizeof("AfterBegin") - 1 + 't': + case sizeof("BeforeEnd") - 1 + 'f': + /* Set context to this. */ + context = thisp; + break; + EMPTY_SWITCH_DEFAULT_CASE(); + } + + /* 4. If context is not an Element or all of the following are true: (...) */ + if (context->type != XML_ELEMENT_NODE + || (php_dom_ns_is_html_and_document_is_html(context) && xmlStrEqual(context->name, BAD_CAST "html"))) { + /* set context to the result of creating an element given this's node document, body, and the HTML namespace. */ + xmlNsPtr html_ns = php_dom_libxml_ns_mapper_ensure_html_ns(php_dom_get_ns_mapper(this_intern)); + + context = xmlNewDocNode(thisp->doc, html_ns, BAD_CAST "body", NULL); + created_context = true; + if (UNEXPECTED(context == NULL)) { + php_dom_throw_error(INVALID_STATE_ERR, true); + goto err; + } + } + + /* 5. Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString. */ + xmlNodePtr fragment = dom_parse_fragment(this_intern, context, string); + if (fragment == NULL) { + goto err; + } + + php_libxml_invalidate_node_list_cache(this_intern->document); + + /* 6. Use the first matching item from this list: (...) */ + switch (ZSTR_LEN(where) + ZSTR_VAL(where)[2]) { + case sizeof("BeforeBegin") - 1 + 'f': + php_dom_pre_insert(this_intern->document, fragment, thisp->parent, thisp); + break; + case sizeof("AfterEnd") - 1 + 't': + php_dom_pre_insert(this_intern->document, fragment, thisp->parent, thisp->next); + break; + case sizeof("AfterBegin") - 1 + 't': + php_dom_pre_insert(this_intern->document, fragment, thisp, thisp->children); + break; + case sizeof("BeforeEnd") - 1 + 'f': + php_dom_node_append(this_intern->document, fragment, thisp); + break; + EMPTY_SWITCH_DEFAULT_CASE(); + } + +err: + if (created_context) { + xmlFreeNode(context); + } +} + /* {{{ URL: https://dom.spec.whatwg.org/#dom-element-toggleattribute Since: */ diff --git a/ext/dom/inner_outer_html_mixin.c b/ext/dom/inner_outer_html_mixin.c index 37283ef351116..b14c3ba708ffb 100644 --- a/ext/dom/inner_outer_html_mixin.c +++ b/ext/dom/inner_outer_html_mixin.c @@ -342,7 +342,7 @@ static xmlNodePtr dom_xml_fragment_parsing_algorithm(dom_object *obj, const xmlN } /* https://w3c.github.io/DOM-Parsing/#dfn-fragment-parsing-algorithm */ -static xmlNodePtr dom_parse_fragment(dom_object *obj, xmlNodePtr context_node, const zend_string *input) +xmlNodePtr dom_parse_fragment(dom_object *obj, xmlNodePtr context_node, const zend_string *input) { if (context_node->doc->type == XML_DOCUMENT_NODE) { return dom_xml_fragment_parsing_algorithm(obj, context_node, input); diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h index 851bc14d12574..e4013e448ae26 100644 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@ -211,6 +211,7 @@ void dom_parent_node_query_selector(xmlNodePtr thisp, dom_object *intern, zval * void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str); void dom_element_matches(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str); void dom_element_closest(xmlNodePtr thisp, dom_object *intern, zval *return_value, const zend_string *selectors_str); +xmlNodePtr dom_parse_fragment(dom_object *obj, xmlNodePtr context_node, const zend_string *input); /* nodemap and nodelist APIs */ xmlNodePtr php_dom_named_node_map_get_named_item(dom_nnodemap_object *objmap, const zend_string *named, bool may_transform); diff --git a/ext/dom/php_dom.stub.php b/ext/dom/php_dom.stub.php index 587694f5dfa70..ac11623471f19 100644 --- a/ext/dom/php_dom.stub.php +++ b/ext/dom/php_dom.stub.php @@ -1632,6 +1632,7 @@ public function getElementsByTagNameNS(?string $namespace, string $localName): H public function insertAdjacentElement(AdjacentPosition $where, Element $element): ?Element {} public function insertAdjacentText(AdjacentPosition $where, string $data): void {} + public function insertAdjacentHTML(AdjacentPosition $where, string $string): void {} /** * @readonly diff --git a/ext/dom/php_dom_arginfo.h b/ext/dom/php_dom_arginfo.h index 3d6f093eb22e9..08dbf22a9b91c 100644 --- a/ext/dom/php_dom_arginfo.h +++ b/ext/dom/php_dom_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 20c13a727cffb452475989a743ec29a8412a52f1 */ + * Stub hash: 860bf40a97ec6570e9f5b0616407ba55d7c8d6f8 */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_dom_import_simplexml, 0, 1, DOMAttr|DOMElement, 0) ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0) @@ -785,6 +785,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Dom_Element_insertAdjacent ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Dom_Element_insertAdjacentHTML, 0, 2, IS_VOID, 0) + ZEND_ARG_OBJ_INFO(0, where, Dom\\AdjacentPosition, 0) + ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Dom_Element_setIdAttribute, 0, 2, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, qualifiedName, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, isId, _IS_BOOL, 0) @@ -1275,6 +1280,7 @@ ZEND_METHOD(Dom_Element, getElementsByTagName); ZEND_METHOD(Dom_Element, getElementsByTagNameNS); ZEND_METHOD(Dom_Element, insertAdjacentElement); ZEND_METHOD(Dom_Element, insertAdjacentText); +ZEND_METHOD(Dom_Element, insertAdjacentHTML); ZEND_METHOD(Dom_Element, setIdAttributeNode); ZEND_METHOD(Dom_Element, querySelector); ZEND_METHOD(Dom_Element, querySelectorAll); @@ -1649,6 +1655,7 @@ static const zend_function_entry class_Dom_Element_methods[] = { ZEND_ME(Dom_Element, getElementsByTagNameNS, arginfo_class_Dom_Element_getElementsByTagNameNS, ZEND_ACC_PUBLIC) ZEND_ME(Dom_Element, insertAdjacentElement, arginfo_class_Dom_Element_insertAdjacentElement, ZEND_ACC_PUBLIC) ZEND_ME(Dom_Element, insertAdjacentText, arginfo_class_Dom_Element_insertAdjacentText, ZEND_ACC_PUBLIC) + ZEND_ME(Dom_Element, insertAdjacentHTML, arginfo_class_Dom_Element_insertAdjacentHTML, ZEND_ACC_PUBLIC) ZEND_RAW_FENTRY("setIdAttribute", zim_DOMElement_setIdAttribute, arginfo_class_Dom_Element_setIdAttribute, ZEND_ACC_PUBLIC, NULL, NULL) ZEND_RAW_FENTRY("setIdAttributeNS", zim_DOMElement_setIdAttributeNS, arginfo_class_Dom_Element_setIdAttributeNS, ZEND_ACC_PUBLIC, NULL, NULL) ZEND_ME(Dom_Element, setIdAttributeNode, arginfo_class_Dom_Element_setIdAttributeNode, ZEND_ACC_PUBLIC) diff --git a/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML.phpt b/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML.phpt new file mode 100644 index 0000000000000..a2c9471e669f0 --- /dev/null +++ b/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML.phpt @@ -0,0 +1,114 @@ +--TEST-- +Dom\Element::insertAdjacentHTML() with HTML nodes +--EXTENSIONS-- +dom +--FILE-- +name, " ---\n"; + + $dom = Dom\HTMLDocument::createFromString("
", LIBXML_NOERROR); + $div = $dom->body->firstChild; + $div->append("Sample text"); + + $div->insertAdjacentHTML($position, $html); + + echo $dom->saveXML(), "\n"; + echo $dom->saveHTML(), "\n"; + var_dump($div->childNodes->length); + var_dump($dom->body->childNodes->length); + } +} + +test("

foo

bar

"); +test("text"); +test(""); + +?> +--EXPECT-- +=== HTML (

foo

bar

) === +--- Position BeforeBegin --- + +

foo

bar

Sample text
+

foo

bar

Sample text
+int(1) +int(3) +--- Position AfterBegin --- + +

foo

bar

Sample text
+

foo

bar

Sample text
+int(3) +int(1) +--- Position BeforeEnd --- + +
Sample text

foo

bar

+
Sample text

foo

bar

+int(3) +int(1) +--- Position AfterEnd --- + +
Sample text

foo

bar

+
Sample text

foo

bar

+int(1) +int(3) +=== HTML (text) === +--- Position BeforeBegin --- + +text
Sample text
+text
Sample text
+int(1) +int(2) +--- Position AfterBegin --- + +
textSample text
+
textSample text
+int(2) +int(1) +--- Position BeforeEnd --- + +
Sample texttext
+
Sample texttext
+int(2) +int(1) +--- Position AfterEnd --- + +
Sample text
text +
Sample text
text +int(1) +int(2) +=== HTML () === +--- Position BeforeBegin --- + +
Sample text
+
Sample text
+int(1) +int(1) +--- Position AfterBegin --- + +
Sample text
+
Sample text
+int(1) +int(1) +--- Position BeforeEnd --- + +
Sample text
+
Sample text
+int(1) +int(1) +--- Position AfterEnd --- + +
Sample text
+
Sample text
+int(1) +int(1) diff --git a/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML_edge_case.phpt b/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML_edge_case.phpt new file mode 100644 index 0000000000000..f3f47eebf3319 --- /dev/null +++ b/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML_edge_case.phpt @@ -0,0 +1,24 @@ +--TEST-- +Dom\Element::insertAdjacentHTML() with HTML nodes - edge case +--EXTENSIONS-- +dom +--FILE-- +createDocumentFragment(); +$node = $fragment->appendChild($dom->createElement("node")); + +$node->insertAdjacentHTML(Dom\AdjacentPosition::BeforeBegin, "

foo

"); + +echo $dom->saveHtml($fragment), "\n"; + +$dom->firstChild->insertAdjacentHTML(Dom\AdjacentPosition::AfterBegin, $node->outerHTML); + +echo $dom->saveHtml(), "\n"; + +?> +--EXPECT-- +

foo

+ diff --git a/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML_errors.phpt b/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML_errors.phpt new file mode 100644 index 0000000000000..b8e13ba436b6b --- /dev/null +++ b/ext/dom/tests/modern/html/interactions/Dom_Element_insertAdjacentHTML_errors.phpt @@ -0,0 +1,54 @@ +--TEST-- +Dom\Element::insertAdjacentHTML() with HTML nodes - error conditions +--EXTENSIONS-- +dom +--FILE-- +createElement('root'); + +echo "--- BeforeBegin no parent ---\n"; + +try { + $element->insertAdjacentHTML(Dom\AdjacentPosition::BeforeBegin, "test"); +} catch (DOMException $e) { + echo $e->getMessage(), "\n"; +} + +echo "--- AfterEnd no parent ---\n"; + +try { + $element->insertAdjacentHTML(Dom\AdjacentPosition::AfterEnd, "test"); +} catch (DOMException $e) { + echo $e->getMessage(), "\n"; +} + +$dom->appendChild($element); + +echo "--- BeforeBegin document parent ---\n"; + +try { + $element->insertAdjacentHTML(Dom\AdjacentPosition::BeforeBegin, "test"); +} catch (DOMException $e) { + echo $e->getMessage(), "\n"; +} + +echo "--- AfterEnd document parent ---\n"; + +try { + $element->insertAdjacentHTML(Dom\AdjacentPosition::AfterEnd, "test"); +} catch (DOMException $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +--- BeforeBegin no parent --- +No Modification Allowed Error +--- AfterEnd no parent --- +No Modification Allowed Error +--- BeforeBegin document parent --- +No Modification Allowed Error +--- AfterEnd document parent --- +No Modification Allowed Error diff --git a/ext/dom/tests/modern/xml/Element_insertAdjacentHTML.phpt b/ext/dom/tests/modern/xml/Element_insertAdjacentHTML.phpt new file mode 100644 index 0000000000000..a233e01759f6f --- /dev/null +++ b/ext/dom/tests/modern/xml/Element_insertAdjacentHTML.phpt @@ -0,0 +1,101 @@ +--TEST-- +Dom\Element::insertAdjacentHTML() with XML nodes +--EXTENSIONS-- +dom +--FILE-- +name, " ---\n"; + + $dom = Dom\XMLDocument::createFromString('
'); + $div = $dom->documentElement->firstChild; + $div->append("Sample text"); + + $div->insertAdjacentHTML($position, $xml); + + echo $dom->saveXML(), "\n"; + var_dump($div->childNodes->length); + var_dump($dom->documentElement->childNodes->length); + } +} + +test(''); +test('&'); +test('text node'); + +?> +--EXPECT-- +=== XML () === +--- Position BeforeBegin --- + +
Sample text
+int(1) +int(3) +--- Position AfterBegin --- + +
Sample text
+int(3) +int(1) +--- Position BeforeEnd --- + +
Sample text
+int(3) +int(1) +--- Position AfterEnd --- + +
Sample text
+int(1) +int(3) +=== XML (&) === +--- Position BeforeBegin --- + +&
Sample text
+int(1) +int(4) +--- Position AfterBegin --- + +
&Sample text
+int(4) +int(1) +--- Position BeforeEnd --- + +
Sample text&
+int(4) +int(1) +--- Position AfterEnd --- + +
Sample text
&
+int(1) +int(4) +=== XML (text node) === +--- Position BeforeBegin --- + +text node
Sample text
+int(1) +int(2) +--- Position AfterBegin --- + +
text nodeSample text
+int(2) +int(1) +--- Position BeforeEnd --- + +
Sample texttext node
+int(2) +int(1) +--- Position AfterEnd --- + +
Sample text
text node
+int(1) +int(2) diff --git a/ext/dom/tests/modern/xml/Element_insertAdjacentHTML_errors.phpt b/ext/dom/tests/modern/xml/Element_insertAdjacentHTML_errors.phpt new file mode 100644 index 0000000000000..0ecd1d4873605 --- /dev/null +++ b/ext/dom/tests/modern/xml/Element_insertAdjacentHTML_errors.phpt @@ -0,0 +1,17 @@ +--TEST-- +Dom\Element::insertAdjacentHTML() with XML nodes - errors +--EXTENSIONS-- +dom +--FILE-- +'); +try { + $dom->documentElement->insertAdjacentHTML(Dom\AdjacentPosition::AfterBegin, ""); +} catch (DOMException $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +XML fragment is not well-formed diff --git a/ext/fileinfo/generate_patch.sh b/ext/fileinfo/generate_patch.sh index da99b1fcdb2af..4e3fade8ec566 100755 --- a/ext/fileinfo/generate_patch.sh +++ b/ext/fileinfo/generate_patch.sh @@ -3,7 +3,7 @@ VERSION=5.45 # Go to fileinfo extension directory. -cd $(CDPATH= cd -- "$(dirname -- "$0")" && pwd -P) +cd "$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd -P)" || exit if [ ! -d libmagic.orig ]; then mkdir libmagic.orig diff --git a/ext/ldap/tests/ldap_sasl_bind_error.phpt b/ext/ldap/tests/ldap_sasl_bind_error.phpt index 3c43f77096bc8..f5497c33fecaa 100644 --- a/ext/ldap/tests/ldap_sasl_bind_error.phpt +++ b/ext/ldap/tests/ldap_sasl_bind_error.phpt @@ -5,6 +5,7 @@ Patrick Allaert # Belgian PHP Testfest 2009 --EXTENSIONS-- ldap +--XLEAK-- --SKIPIF-- diff --git a/ext/ldap/tests/ldap_set_rebind_proc_basic.phpt b/ext/ldap/tests/ldap_set_rebind_proc_basic.phpt index 00c7bb81d9dd3..a328912a5e168 100644 --- a/ext/ldap/tests/ldap_set_rebind_proc_basic.phpt +++ b/ext/ldap/tests/ldap_set_rebind_proc_basic.phpt @@ -6,7 +6,10 @@ Patrick Allaert --EXTENSIONS-- ldap --SKIPIF-- - + --FILE-- --EXTENSIONS-- ldap --SKIPIF-- - + --FILE-- 7 && memcmp(Z_STRVAL_P(val), "file://", sizeof("file://") - 1) == 0) { - if (!php_openssl_check_path_str(Z_STR_P(val), file_path, arg_num)) { + if (ZSTR_LEN(val_str) > 7 && memcmp(ZSTR_VAL(val_str), "file://", sizeof("file://") - 1) == 0) { + if (!php_openssl_check_path_str(val_str, file_path, arg_num)) { + zend_string_release_ex(val_str, false); TMP_CLEAN; } is_file = true; @@ -3688,7 +3693,7 @@ static EVP_PKEY *php_openssl_pkey_from_zval( /* it's an X509 file/cert of some kind, and we need to extract the data from that */ if (public_key) { php_openssl_errors_set_mark(); - cert = php_openssl_x509_from_str(Z_STR_P(val), arg_num, false, NULL); + cert = php_openssl_x509_from_str(val_str, arg_num, false, NULL); if (cert) { free_cert = 1; @@ -3699,10 +3704,11 @@ static EVP_PKEY *php_openssl_pkey_from_zval( if (is_file) { in = BIO_new_file(file_path, PHP_OPENSSL_BIO_MODE_R(PKCS7_BINARY)); } else { - in = BIO_new_mem_buf(Z_STRVAL_P(val), (int)Z_STRLEN_P(val)); + in = BIO_new_mem_buf(ZSTR_VAL(val_str), (int)ZSTR_LEN(val_str)); } if (in == NULL) { php_openssl_store_errors(); + zend_string_release_ex(val_str, false); TMP_CLEAN; } key = PEM_read_bio_PUBKEY(in, NULL,NULL, NULL); @@ -3715,10 +3721,11 @@ static EVP_PKEY *php_openssl_pkey_from_zval( if (is_file) { in = BIO_new_file(file_path, PHP_OPENSSL_BIO_MODE_R(PKCS7_BINARY)); } else { - in = BIO_new_mem_buf(Z_STRVAL_P(val), (int)Z_STRLEN_P(val)); + in = BIO_new_mem_buf(ZSTR_VAL(val_str), (int)ZSTR_LEN(val_str)); } if (in == NULL) { + zend_string_release_ex(val_str, false); TMP_CLEAN; } if (passphrase == NULL) { @@ -3731,6 +3738,8 @@ static EVP_PKEY *php_openssl_pkey_from_zval( } BIO_free(in); } + + zend_string_release_ex(val_str, false); } if (key == NULL) { @@ -4909,7 +4918,7 @@ PHP_FUNCTION(openssl_pkey_export_to_file) } if (!php_openssl_check_path(filename, filename_len, file_path, 2)) { - RETURN_FALSE; + goto clean_exit_key; } PHP_SSL_REQ_INIT(&req); @@ -4945,8 +4954,9 @@ PHP_FUNCTION(openssl_pkey_export_to_file) clean_exit: PHP_SSL_REQ_DISPOSE(&req); - EVP_PKEY_free(key); BIO_free(bio_out); +clean_exit_key: + EVP_PKEY_free(key); } /* }}} */ diff --git a/ext/openssl/tests/openssl_csr_export_to_file_leak.phpt b/ext/openssl/tests/openssl_csr_export_to_file_leak.phpt new file mode 100644 index 0000000000000..e6ce373d355b1 --- /dev/null +++ b/ext/openssl/tests/openssl_csr_export_to_file_leak.phpt @@ -0,0 +1,14 @@ +--TEST-- +openssl_csr_export_to_file memory leak +--EXTENSIONS-- +openssl +--FILE-- + +--EXPECTF-- +Warning: openssl_csr_export_to_file(output_filename): must be a valid file path %s +bool(false) diff --git a/ext/openssl/tests/openssl_pkey_export_to_file_leak.phpt b/ext/openssl/tests/openssl_pkey_export_to_file_leak.phpt new file mode 100644 index 0000000000000..5e2bdff6b48fc --- /dev/null +++ b/ext/openssl/tests/openssl_pkey_export_to_file_leak.phpt @@ -0,0 +1,15 @@ +--TEST-- +openssl_pkey_export_to_file memory leak +--EXTENSIONS-- +openssl +--FILE-- + +--EXPECTF-- +Warning: openssl_pkey_export_to_file(output_filename): must be a valid file path %s +bool(false) diff --git a/ext/openssl/tests/openssl_pkey_export_to_file_object_to_string.phpt b/ext/openssl/tests/openssl_pkey_export_to_file_object_to_string.phpt new file mode 100644 index 0000000000000..0e504bfa4ac63 --- /dev/null +++ b/ext/openssl/tests/openssl_pkey_export_to_file_object_to_string.phpt @@ -0,0 +1,27 @@ +--TEST-- +openssl_pkey_export_to_file object to string conversion +--EXTENSIONS-- +openssl +--FILE-- + +--EXPECT-- +array(2) { + [0]=> + object(Test)#1 (0) { + } + [1]=> + string(0) "" +} diff --git a/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt b/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt new file mode 100644 index 0000000000000..5775c2597c3e0 --- /dev/null +++ b/ext/openssl/tests/openssl_x509_export_to_file_leak.phpt @@ -0,0 +1,14 @@ +--TEST-- +openssl_x509_export_to_file memory leak +--EXTENSIONS-- +openssl +--FILE-- + +--EXPECTF-- +Warning: openssl_x509_export_to_file(output_filename): must be a valid file path %s +bool(false) diff --git a/ext/openssl/tests/php_openssl_pkey_from_zval_leak.phpt b/ext/openssl/tests/php_openssl_pkey_from_zval_leak.phpt new file mode 100644 index 0000000000000..2b19dd311150a --- /dev/null +++ b/ext/openssl/tests/php_openssl_pkey_from_zval_leak.phpt @@ -0,0 +1,23 @@ +--TEST-- +php_openssl_pkey_from_zval memory leak +--EXTENSIONS-- +openssl +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECT-- +create a leak diff --git a/ext/pcntl/tests/pcntl_setns_basic.phpt b/ext/pcntl/tests/pcntl_setns_basic.phpt index a4f2ea773c57f..1a08d8f1c8559 100644 --- a/ext/pcntl/tests/pcntl_setns_basic.phpt +++ b/ext/pcntl/tests/pcntl_setns_basic.phpt @@ -7,6 +7,14 @@ posix --FILE-- --FILE-- --FILE-- 512) { + if (got >= 512) { if (phar_is_tar(pos, fname)) { php_stream_rewind(fp); return phar_parse_tarfile(fp, fname, fname_len, alias, alias_len, pphar, compression, error); diff --git a/ext/phar/tar.c b/ext/phar/tar.c index bfbcd4216af21..46f59a6042304 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -249,9 +249,8 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch entry.is_tar = 1; entry.is_crc_checked = 1; entry.phar = myphar; - pos += sizeof(buf); - do { + while (true) { phar_entry_info *newentry; pos = php_stream_tell(fp); @@ -592,6 +591,11 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch } } + /* Only read next header if we're not yet at the end */ + if (php_stream_tell(fp) == totalsize) { + break; + } + read = php_stream_read(fp, buf, sizeof(buf)); if (read != sizeof(buf)) { @@ -602,7 +606,7 @@ zend_result phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, ch phar_destroy_phar_data(myphar); return FAILURE; } - } while (!php_stream_eof(fp)); + } if (zend_hash_str_exists(&(myphar->manifest), ".phar/stub.php", sizeof(".phar/stub.php")-1)) { myphar->is_data = 0; diff --git a/ext/phar/tests/tar/gh16695_1.phpt b/ext/phar/tests/tar/gh16695_1.phpt new file mode 100644 index 0000000000000..8ce82bcf28dd9 --- /dev/null +++ b/ext/phar/tests/tar/gh16695_1.phpt @@ -0,0 +1,28 @@ +--TEST-- +GH-16695 (phar:// tar parser and zero-length file header blocks) +--CREDITS-- +hakre +--EXTENSIONS-- +phar +--INI-- +phar.require_hash=0 +--FILE-- + +--CLEAN-- + +--EXPECTF-- +int(512) + +Warning: file_get_contents(%stls): Failed to open stream: phar error: path "tls" is a directory in %s on line %d +bool(false) diff --git a/ext/phar/tests/tar/gh16695_2.phpt b/ext/phar/tests/tar/gh16695_2.phpt new file mode 100644 index 0000000000000..5b7200398c496 --- /dev/null +++ b/ext/phar/tests/tar/gh16695_2.phpt @@ -0,0 +1,26 @@ +--TEST-- +GH-16695 (phar:// tar parser and zero-length file header blocks) +--CREDITS-- +hakre +--EXTENSIONS-- +phar +--INI-- +phar.require_hash=0 +--FILE-- + +--CLEAN-- + +--EXPECT-- +int(1024) +string(122) "{"Name":"default","Metadata":{},"Endpoints":{"docker":{"Host":"unix:///run/user/1000/docker.sock","SkipTLSVerify":false}}}" diff --git a/ext/phar/tests/tar/gh16695_3.phpt b/ext/phar/tests/tar/gh16695_3.phpt new file mode 100644 index 0000000000000..eddf697b0137c --- /dev/null +++ b/ext/phar/tests/tar/gh16695_3.phpt @@ -0,0 +1,26 @@ +--TEST-- +GH-16695 (phar:// tar parser and zero-length file header blocks) +--CREDITS-- +hakre +--EXTENSIONS-- +phar +--INI-- +phar.require_hash=0 +--FILE-- + +--CLEAN-- + +--EXPECT-- +int(512) +string(0) "" diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 36682e62a55d3..ecfa20fe0c0c8 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -301,13 +301,6 @@ static zend_object *reflection_objects_new(zend_class_entry *class_type) /* {{{ } /* }}} */ -static zval *reflection_instantiate(zend_class_entry *pce, zval *object) /* {{{ */ -{ - object_init_ex(object, pce); - return object; -} -/* }}} */ - static void _const_string(smart_str *str, const char *name, zval *value, const char *indent); static void _function_string(smart_str *str, zend_function *fptr, zend_class_entry *scope, const char* indent); static void _property_string(smart_str *str, zend_property_info *prop, const char *prop_name, const char* indent); @@ -1168,7 +1161,7 @@ static void reflection_attribute_factory(zval *object, HashTable *attributes, ze reflection_object *intern; attribute_reference *reference; - reflection_instantiate(reflection_attribute_ptr, object); + object_init_ex(object, reflection_attribute_ptr); intern = Z_REFLECTION_P(object); reference = (attribute_reference*) emalloc(sizeof(attribute_reference)); reference->attributes = attributes; @@ -1316,7 +1309,7 @@ PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object) zend_class_entry *reflection_ce = ce->ce_flags & ZEND_ACC_ENUM ? reflection_enum_ptr : reflection_class_ptr; - reflection_instantiate(reflection_ce, object); + object_init_ex(object, reflection_ce); intern = Z_REFLECTION_P(object); intern->ptr = ce; intern->ref_type = REF_TYPE_OTHER; @@ -1325,10 +1318,21 @@ PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object) } /* }}} */ +/* {{{ reflection_extension_factory_ex */ +static void reflection_extension_factory_ex(zval *object, zend_module_entry *module) +{ + object_init_ex(object, reflection_extension_ptr); + reflection_object *intern = Z_REFLECTION_P(object); + intern->ptr = module; + intern->ref_type = REF_TYPE_OTHER; + intern->ce = NULL; + ZVAL_STRING(reflection_prop_name(object), module->name); +} +/* }}} */ + /* {{{ reflection_extension_factory */ static void reflection_extension_factory(zval *object, const char *name_str) { - reflection_object *intern; size_t name_len = strlen(name_str); zend_string *lcname; struct _zend_module_entry *module; @@ -1341,12 +1345,7 @@ static void reflection_extension_factory(zval *object, const char *name_str) return; } - reflection_instantiate(reflection_extension_ptr, object); - intern = Z_REFLECTION_P(object); - intern->ptr = module; - intern->ref_type = REF_TYPE_OTHER; - intern->ce = NULL; - ZVAL_STRINGL(reflection_prop_name(object), module->name, name_len); + reflection_extension_factory_ex(object, module); } /* }}} */ @@ -1357,7 +1356,7 @@ static void reflection_parameter_factory(zend_function *fptr, zval *closure_obje parameter_reference *reference; zval *prop_name; - reflection_instantiate(reflection_parameter_ptr, object); + object_init_ex(object, reflection_parameter_ptr); intern = Z_REFLECTION_P(object); reference = (parameter_reference*) emalloc(sizeof(parameter_reference)); reference->arg_info = arg_info; @@ -1432,13 +1431,13 @@ static void reflection_type_factory(zend_type type, zval *object, bool legacy_be switch (type_kind) { case INTERSECTION_TYPE: - reflection_instantiate(reflection_intersection_type_ptr, object); + object_init_ex(object, reflection_intersection_type_ptr); break; case UNION_TYPE: - reflection_instantiate(reflection_union_type_ptr, object); + object_init_ex(object, reflection_union_type_ptr); break; case NAMED_TYPE: - reflection_instantiate(reflection_named_type_ptr, object); + object_init_ex(object, reflection_named_type_ptr); break; EMPTY_SWITCH_DEFAULT_CASE(); } @@ -1465,7 +1464,7 @@ static void reflection_type_factory(zend_type type, zval *object, bool legacy_be static void reflection_function_factory(zend_function *function, zval *closure_object, zval *object) { reflection_object *intern; - reflection_instantiate(reflection_function_ptr, object); + object_init_ex(object, reflection_function_ptr); intern = Z_REFLECTION_P(object); intern->ptr = function; intern->ref_type = REF_TYPE_FUNCTION; @@ -1482,7 +1481,7 @@ static void reflection_method_factory(zend_class_entry *ce, zend_function *metho { reflection_object *intern; - reflection_instantiate(reflection_method_ptr, object); + object_init_ex(object, reflection_method_ptr); intern = Z_REFLECTION_P(object); intern->ptr = method; intern->ref_type = REF_TYPE_FUNCTION; @@ -1502,7 +1501,7 @@ static void reflection_property_factory(zend_class_entry *ce, zend_string *name, reflection_object *intern; property_reference *reference; - reflection_instantiate(reflection_property_ptr, object); + object_init_ex(object, reflection_property_ptr); intern = Z_REFLECTION_P(object); reference = (property_reference*) emalloc(sizeof(property_reference)); reference->prop = prop; @@ -1527,7 +1526,7 @@ static void reflection_class_constant_factory(zend_string *name_str, zend_class_ { reflection_object *intern; - reflection_instantiate(reflection_class_constant_ptr, object); + object_init_ex(object, reflection_class_constant_ptr); intern = Z_REFLECTION_P(object); intern->ptr = constant; intern->ref_type = REF_TYPE_CLASS_CONSTANT; @@ -1545,7 +1544,7 @@ static void reflection_enum_case_factory(zend_class_entry *ce, zend_string *name zend_class_entry *case_reflection_class = ce->enum_backing_type == IS_UNDEF ? reflection_enum_unit_case_ptr : reflection_enum_backed_case_ptr; - reflection_instantiate(case_reflection_class, object); + object_init_ex(object, case_reflection_class); intern = Z_REFLECTION_P(object); intern->ptr = constant; intern->ref_type = REF_TYPE_CLASS_CONSTANT; @@ -2821,7 +2820,7 @@ ZEND_METHOD(ReflectionParameter, getAttributes) param->fptr->type == ZEND_USER_FUNCTION ? param->fptr->op_array.filename : NULL); } -/* {{{ Returns whether this parameter is an optional parameter */ +/* {{{ Returns the index of the parameter, starting from 0 */ ZEND_METHOD(ReflectionParameter, getPosition) { reflection_object *intern; @@ -7592,6 +7591,59 @@ ZEND_METHOD(ReflectionConstant, getFileName) RETURN_FALSE; } +static void reflection_constant_find_ext(INTERNAL_FUNCTION_PARAMETERS, bool only_name) +{ + reflection_object *intern; + zend_constant *const_; + + ZEND_PARSE_PARAMETERS_NONE(); + + GET_REFLECTION_OBJECT_PTR(const_); + int module_number = ZEND_CONSTANT_MODULE_NUMBER(const_); + if (module_number == PHP_USER_CONSTANT) { + // For user constants, ReflectionConstant::getExtension() returns null, + // ReflectionConstant::getExtensionName() returns false + if (only_name) { + RETURN_FALSE; + } + RETURN_NULL(); + } + zend_module_entry *module; + ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) { + if (module->module_number != module_number) { + continue; + } + if (only_name) { + RETURN_STRING(module->name); + } + reflection_extension_factory_ex(return_value, module); + return; + } ZEND_HASH_FOREACH_END(); + + zend_throw_exception_ex( + reflection_exception_ptr, + 0, + "Unable to locate extension with module_number %d that provides constant %s", + module_number, + ZSTR_VAL(const_->name) + ); + RETURN_THROWS(); +} + +/* {{{ Returns NULL or the extension the constant belongs to */ +ZEND_METHOD(ReflectionConstant, getExtension) +{ + reflection_constant_find_ext(INTERNAL_FUNCTION_PARAM_PASSTHRU, false); +} +/* }}} */ + +/* {{{ Returns false or the name of the extension the constant belongs to */ +ZEND_METHOD(ReflectionConstant, getExtensionName) +{ + reflection_constant_find_ext(INTERNAL_FUNCTION_PARAM_PASSTHRU, true); +} +/* }}} */ + ZEND_METHOD(ReflectionConstant, __toString) { reflection_object *intern; diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php index eb64f0de72b43..de15e405c7329 100644 --- a/ext/reflection/php_reflection.stub.php +++ b/ext/reflection/php_reflection.stub.php @@ -918,5 +918,9 @@ public function isDeprecated(): bool {} public function getFileName(): string|false {} + public function getExtension(): ?ReflectionExtension {} + + public function getExtensionName(): string|false {} + public function __toString(): string {} } diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h index 6ad146c6ef9d5..6cdadc5c5b300 100644 --- a/ext/reflection/php_reflection_arginfo.h +++ b/ext/reflection/php_reflection_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 603181d7e1d8292ef694913d4495d3cbb9dd7798 */ + * Stub hash: dbb59b2dd53c2849f66c00ce12228ebb07f50773 */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 1, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, modifiers, IS_LONG, 0) @@ -708,6 +708,11 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_ReflectionConstant_getFileName, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionConstant_getExtension, 0, 0, ReflectionExtension, 1) +ZEND_END_ARG_INFO() + +#define arginfo_class_ReflectionConstant_getExtensionName arginfo_class_ReflectionConstant_getFileName + #define arginfo_class_ReflectionConstant___toString arginfo_class_ReflectionFunction___toString ZEND_METHOD(Reflection, getModifierNames); @@ -975,6 +980,8 @@ ZEND_METHOD(ReflectionConstant, getShortName); ZEND_METHOD(ReflectionConstant, getValue); ZEND_METHOD(ReflectionConstant, isDeprecated); ZEND_METHOD(ReflectionConstant, getFileName); +ZEND_METHOD(ReflectionConstant, getExtension); +ZEND_METHOD(ReflectionConstant, getExtensionName); ZEND_METHOD(ReflectionConstant, __toString); static const zend_function_entry class_Reflection_methods[] = { @@ -1341,6 +1348,8 @@ static const zend_function_entry class_ReflectionConstant_methods[] = { ZEND_ME(ReflectionConstant, getValue, arginfo_class_ReflectionConstant_getValue, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionConstant, isDeprecated, arginfo_class_ReflectionConstant_isDeprecated, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionConstant, getFileName, arginfo_class_ReflectionConstant_getFileName, ZEND_ACC_PUBLIC) + ZEND_ME(ReflectionConstant, getExtension, arginfo_class_ReflectionConstant_getExtension, ZEND_ACC_PUBLIC) + ZEND_ME(ReflectionConstant, getExtensionName, arginfo_class_ReflectionConstant_getExtensionName, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionConstant, __toString, arginfo_class_ReflectionConstant___toString, ZEND_ACC_PUBLIC) ZEND_FE_END }; diff --git a/ext/reflection/tests/ReflectionConstant_getExtension.phpt b/ext/reflection/tests/ReflectionConstant_getExtension.phpt new file mode 100644 index 0000000000000..9cc010461dc57 --- /dev/null +++ b/ext/reflection/tests/ReflectionConstant_getExtension.phpt @@ -0,0 +1,32 @@ +--TEST-- +ReflectionConstant::getExtension() +--EXTENSIONS-- +json +--FILE-- +getExtension()); + +$reflectionConstant = new ReflectionConstant('JSON_ERROR_NONE'); +var_dump($reflectionConstant->getExtension()); + +const CT_CONST = 5; +$reflectionConstant = new ReflectionConstant('CT_CONST'); +var_dump($reflectionConstant->getExtension()); + +define('RT_CONST', 6); +$reflectionConstant = new ReflectionConstant('RT_CONST'); +var_dump($reflectionConstant->getExtension()); +?> +--EXPECTF-- +object(ReflectionExtension)#%d (1) { + ["name"]=> + string(4) "Core" +} +object(ReflectionExtension)#%d (1) { + ["name"]=> + string(4) "json" +} +NULL +NULL diff --git a/ext/reflection/tests/ReflectionConstant_getExtensionName.phpt b/ext/reflection/tests/ReflectionConstant_getExtensionName.phpt new file mode 100644 index 0000000000000..dc4322dce4aba --- /dev/null +++ b/ext/reflection/tests/ReflectionConstant_getExtensionName.phpt @@ -0,0 +1,26 @@ +--TEST-- +ReflectionConstant::getExtensionName() +--EXTENSIONS-- +json +--FILE-- +getExtensionName()); + +$reflectionConstant = new ReflectionConstant('JSON_ERROR_NONE'); +var_dump($reflectionConstant->getExtensionName()); + +const CT_CONST = 5; +$reflectionConstant = new ReflectionConstant('CT_CONST'); +var_dump($reflectionConstant->getExtensionName()); + +define('RT_CONST', 6); +$reflectionConstant = new ReflectionConstant('RT_CONST'); +var_dump($reflectionConstant->getExtensionName()); +?> +--EXPECT-- +string(4) "Core" +string(4) "json" +bool(false) +bool(false) diff --git a/ext/soap/tests/gh15711.phpt b/ext/soap/tests/gh15711.phpt index a49ff280fee59..b72251cc6f95b 100644 --- a/ext/soap/tests/gh15711.phpt +++ b/ext/soap/tests/gh15711.phpt @@ -33,7 +33,7 @@ class TestSoapClient extends SoapClient { } } -$client = new TestSoapClient('ext/soap/tests/gh15711.wsdl', ['classmap' => ['book' => 'book']]); +$client = new TestSoapClient(__DIR__ . '/gh15711.wsdl', ['classmap' => ['book' => 'book']]); echo "--- Test with backed enum ---\n"; diff --git a/ext/standard/array.c b/ext/standard/array.c index 111966562bf4f..73a5f1ee4a328 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -6699,7 +6699,7 @@ PHP_FUNCTION(array_find_key) } /* }}} */ -/* {{{ Search within an array and returns true if an element is found. */ +/* {{{ Checks if at least one array element satisfies a callback function. */ PHP_FUNCTION(array_any) { zval *array = NULL; @@ -6719,7 +6719,7 @@ PHP_FUNCTION(array_any) } /* }}} */ -/* {{{ Search within an array and returns true if an element is found. */ +/* {{{ Checks if all array elements satisfy a callback function. */ PHP_FUNCTION(array_all) { zval *array = NULL; diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index dbbf9896f2b73..af6f3664c6943 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -1182,6 +1182,7 @@ PHP_FUNCTION(time_nanosleep) RETURN_TRUE; } else if (errno == EINTR) { array_init(return_value); + MSAN_UNPOISON(php_rem); add_assoc_long_ex(return_value, "seconds", sizeof("seconds")-1, php_rem.tv_sec); add_assoc_long_ex(return_value, "nanoseconds", sizeof("nanoseconds")-1, php_rem.tv_nsec); return; diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 14eb6cda9735a..54687f6cdf307 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -177,7 +177,19 @@ PHPAPI zend_string *php_crypt(const char *password, const int pass_len, const ch if (!crypt_res || (salt[0] == '*' && salt[1] == '0')) { return NULL; - } else { + } + else if (!strcmp(crypt_res, "*")) { + /* Musl crypt() uses "*" as a failure token rather + * than the "*0" that libxcrypt/PHP use. Our test + * suite in particular looks for "*0" in a few places, + * and it would be annoying to handle both values + * explicitly. It seems wise to abstract this detail + * from the end user: if it's annoying for us, imagine + * how annoying it would be in end-user code; not that + * anyone would think of it. */ + return NULL; + } + else { result = zend_string_init(crypt_res, strlen(crypt_res), 0); return result; } diff --git a/ext/standard/tests/array/001.phpt b/ext/standard/tests/array/001.phpt index c88aee367fad7..908f707e4b16d 100644 --- a/ext/standard/tests/array/001.phpt +++ b/ext/standard/tests/array/001.phpt @@ -4,7 +4,7 @@ Test array_merge and array_walk precision=14 --FILE-- null, "NULL" => NULL, "\a" => "\a", "\cx" => "\cx", "\e" => "\e", - "\f" => "\f", "\n" =>"\n", "\r" => "\r", "\t" => "\t", "\xhh" => "\xhh", - "\ddd" => "\ddd", "\v" => "\v" - ), - - // array contains combination of capital/small letters - array ('l' => "lemoN", 'O' => "Orange", 'b' => "banana", 'a' => "apple", 'Te' => "Test", - 'T' => "TTTT", 't' => "ttt", 'w' => "ww", 'x' => "x", 'X' => "X", 'o' => "oraNGe", - 'B' => "BANANA" - ) -); - -$flags = array("SORT_REGULAR" => SORT_REGULAR, "SORT_STRING" => SORT_STRING); - -$count = 1; -echo "\n-- Testing arsort() by supplying various string arrays --\n"; - -// loop through to test arsort() with different arrays -foreach ($various_arrays as $array) { - echo "\n-- Iteration $count --\n"; - - echo "- With default sort_flag -\n"; - $temp_array = $array; - var_dump(arsort($temp_array) ); // expecting : bool(true) - var_dump($temp_array); - - // loop through $flags array and setting all possible flag values - foreach($flags as $key => $flag){ - echo "- Sort_flag = $key -\n"; - $temp_array = $array; - var_dump(arsort($temp_array, $flag) ); // expecting : bool(true) - var_dump($temp_array); - } - $count++; -} - -echo "Done\n"; -?> ---EXPECT-- -*** Testing arsort() : usage variations *** - --- Testing arsort() by supplying various string arrays -- - --- Iteration 1 -- -- With default sort_flag - -bool(true) -array(12) { - ["\xhh"]=> - string(4) "\xhh" - ["\ddd"]=> - string(4) "\ddd" - ["\cx"]=> - string(3) "\cx" - ["\a"]=> - string(2) "\a" - [""]=> - string(1) "" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - ["null"]=> - NULL - ["NULL"]=> - NULL -} -- Sort_flag = SORT_REGULAR - -bool(true) -array(12) { - ["\xhh"]=> - string(4) "\xhh" - ["\ddd"]=> - string(4) "\ddd" - ["\cx"]=> - string(3) "\cx" - ["\a"]=> - string(2) "\a" - [""]=> - string(1) "" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - ["null"]=> - NULL - ["NULL"]=> - NULL -} -- Sort_flag = SORT_STRING - -bool(true) -array(12) { - ["\xhh"]=> - string(4) "\xhh" - ["\ddd"]=> - string(4) "\ddd" - ["\cx"]=> - string(3) "\cx" - ["\a"]=> - string(2) "\a" - [""]=> - string(1) "" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - ["null"]=> - NULL - ["NULL"]=> - NULL -} - --- Iteration 2 -- -- With default sort_flag - -bool(true) -array(12) { - ["x"]=> - string(1) "x" - ["w"]=> - string(2) "ww" - ["t"]=> - string(3) "ttt" - ["o"]=> - string(6) "oraNGe" - ["l"]=> - string(5) "lemoN" - ["b"]=> - string(6) "banana" - ["a"]=> - string(5) "apple" - ["X"]=> - string(1) "X" - ["Te"]=> - string(4) "Test" - ["T"]=> - string(4) "TTTT" - ["O"]=> - string(6) "Orange" - ["B"]=> - string(6) "BANANA" -} -- Sort_flag = SORT_REGULAR - -bool(true) -array(12) { - ["x"]=> - string(1) "x" - ["w"]=> - string(2) "ww" - ["t"]=> - string(3) "ttt" - ["o"]=> - string(6) "oraNGe" - ["l"]=> - string(5) "lemoN" - ["b"]=> - string(6) "banana" - ["a"]=> - string(5) "apple" - ["X"]=> - string(1) "X" - ["Te"]=> - string(4) "Test" - ["T"]=> - string(4) "TTTT" - ["O"]=> - string(6) "Orange" - ["B"]=> - string(6) "BANANA" -} -- Sort_flag = SORT_STRING - -bool(true) -array(12) { - ["x"]=> - string(1) "x" - ["w"]=> - string(2) "ww" - ["t"]=> - string(3) "ttt" - ["o"]=> - string(6) "oraNGe" - ["l"]=> - string(5) "lemoN" - ["b"]=> - string(6) "banana" - ["a"]=> - string(5) "apple" - ["X"]=> - string(1) "X" - ["Te"]=> - string(4) "Test" - ["T"]=> - string(4) "TTTT" - ["O"]=> - string(6) "Orange" - ["B"]=> - string(6) "BANANA" -} -Done diff --git a/ext/standard/tests/array/asort_variation5.phpt b/ext/standard/tests/array/asort_variation5.phpt deleted file mode 100644 index f39c4829b1758..0000000000000 --- a/ext/standard/tests/array/asort_variation5.phpt +++ /dev/null @@ -1,236 +0,0 @@ ---TEST-- -Test asort() function : usage variations - sort strings ---FILE-- - null, "NULL" => NULL, "\a" => "\a", "\cx" => "\cx", "\e" => "\e", - "\f" => "\f", "\n" =>"\n", "\r" => "\r", "\t" => "\t", "\xhh" => "\xhh", - "\ddd" => "\ddd", "\v" => "\v" - ), - - // array contains combination of capital/small letters - array ('l' => "lemoN", 'O' => "Orange", 'b' => "banana", 'a' => "apple", 'Te' => "Test", - 'T' => "TTTT", 't' => "ttt", 'w' => "ww", 'x' => "x", 'X' => "X", 'o' => "oraNGe", - 'B' => "BANANA" - ) -); - -$flags = array("SORT_REGULAR" => SORT_REGULAR, "SORT_STRING" => SORT_STRING); - -$count = 1; -echo "\n-- Testing asort() by supplying various string arrays --\n"; - -// loop through to test asort() with different arrays -foreach ($various_arrays as $array) { - echo "\n-- Iteration $count --\n"; - - echo "- With default sort_flag -\n"; - $temp_array = $array; - var_dump(asort($temp_array) ); // expecting : bool(true) - var_dump($temp_array); - - // loop through $flags array and setting all possible flag values - foreach($flags as $key => $flag){ - echo "- Sort_flag = $key -\n"; - $temp_array = $array; - var_dump(asort($temp_array, $flag) ); // expecting : bool(true) - var_dump($temp_array); - } - $count++; -} - -echo "Done\n"; -?> ---EXPECT-- -*** Testing asort() : usage variations *** - --- Testing asort() by supplying various string arrays -- - --- Iteration 1 -- -- With default sort_flag - -bool(true) -array(12) { - ["null"]=> - NULL - ["NULL"]=> - NULL - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [""]=> - string(1) "" - ["\a"]=> - string(2) "\a" - ["\cx"]=> - string(3) "\cx" - ["\ddd"]=> - string(4) "\ddd" - ["\xhh"]=> - string(4) "\xhh" -} -- Sort_flag = SORT_REGULAR - -bool(true) -array(12) { - ["null"]=> - NULL - ["NULL"]=> - NULL - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [""]=> - string(1) "" - ["\a"]=> - string(2) "\a" - ["\cx"]=> - string(3) "\cx" - ["\ddd"]=> - string(4) "\ddd" - ["\xhh"]=> - string(4) "\xhh" -} -- Sort_flag = SORT_STRING - -bool(true) -array(12) { - ["null"]=> - NULL - ["NULL"]=> - NULL - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [""]=> - string(1) "" - ["\a"]=> - string(2) "\a" - ["\cx"]=> - string(3) "\cx" - ["\ddd"]=> - string(4) "\ddd" - ["\xhh"]=> - string(4) "\xhh" -} - --- Iteration 2 -- -- With default sort_flag - -bool(true) -array(12) { - ["B"]=> - string(6) "BANANA" - ["O"]=> - string(6) "Orange" - ["T"]=> - string(4) "TTTT" - ["Te"]=> - string(4) "Test" - ["X"]=> - string(1) "X" - ["a"]=> - string(5) "apple" - ["b"]=> - string(6) "banana" - ["l"]=> - string(5) "lemoN" - ["o"]=> - string(6) "oraNGe" - ["t"]=> - string(3) "ttt" - ["w"]=> - string(2) "ww" - ["x"]=> - string(1) "x" -} -- Sort_flag = SORT_REGULAR - -bool(true) -array(12) { - ["B"]=> - string(6) "BANANA" - ["O"]=> - string(6) "Orange" - ["T"]=> - string(4) "TTTT" - ["Te"]=> - string(4) "Test" - ["X"]=> - string(1) "X" - ["a"]=> - string(5) "apple" - ["b"]=> - string(6) "banana" - ["l"]=> - string(5) "lemoN" - ["o"]=> - string(6) "oraNGe" - ["t"]=> - string(3) "ttt" - ["w"]=> - string(2) "ww" - ["x"]=> - string(1) "x" -} -- Sort_flag = SORT_STRING - -bool(true) -array(12) { - ["B"]=> - string(6) "BANANA" - ["O"]=> - string(6) "Orange" - ["T"]=> - string(4) "TTTT" - ["Te"]=> - string(4) "Test" - ["X"]=> - string(1) "X" - ["a"]=> - string(5) "apple" - ["b"]=> - string(6) "banana" - ["l"]=> - string(5) "lemoN" - ["o"]=> - string(6) "oraNGe" - ["t"]=> - string(3) "ttt" - ["w"]=> - string(2) "ww" - ["x"]=> - string(1) "x" -} -Done diff --git a/ext/standard/tests/array/krsort_variation5.phpt b/ext/standard/tests/array/krsort_variation5.phpt deleted file mode 100644 index 7475805f8d4d5..0000000000000 --- a/ext/standard/tests/array/krsort_variation5.phpt +++ /dev/null @@ -1,225 +0,0 @@ ---TEST-- -Test krsort() function : usage variations - sort strings ---FILE-- - null, NULL => NULL, "\a" => "\a", "\cx" => "\cx", "\e" => "\e", - "\f" => "\f", "\n" =>"\n", "\r" => "\r", "\t" => "\t", "\xhh" => "\xhh", - "\ddd" => "\ddd", "\v" => "\v" - ), - - // array containing different strings with key values - array ( 'Lemon' => "lemoN", 'o' => "Orange", 'B' => "banana", 'Apple' => "apple", 'te' => "Test", - 't' => "TTTT", 'T' => "ttt", 'W' => "ww", 'X' => "x", 'x' => "X", 'O' => "oraNGe", - 'B' => "BANANA" - ) -); - -$flags = array("SORT_REGULAR" => SORT_REGULAR, "SORT_STRING" => SORT_STRING); - -$count = 1; -echo "\n-- Testing krsort() by supplying various string arrays --\n"; - -// loop through to test krsort() with different arrays -foreach ($various_arrays as $array) { - echo "\n-- Iteration $count --\n"; - - echo "- With default sort flag -\n"; - $temp_array = $array; - var_dump(krsort($temp_array) ); // expecting : bool(true) - var_dump($temp_array); - - // loop through $flags array and call krsort() with all possible sort flag values - foreach($flags as $key => $flag){ - echo "- Sort flag = $key -\n"; - $temp_array = $array; - var_dump(krsort($temp_array, $flag) ); // expecting : bool(true) - var_dump($temp_array); - } - $count++; -} - -echo "Done\n"; -?> ---EXPECT-- -*** Testing krsort() : usage variations *** - --- Testing krsort() by supplying various string arrays -- - --- Iteration 1 -- -- With default sort flag - -bool(true) -array(11) { - ["\xhh"]=> - string(4) "\xhh" - ["\ddd"]=> - string(4) "\ddd" - ["\cx"]=> - string(3) "\cx" - ["\a"]=> - string(2) "\a" - [""]=> - string(1) "" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [""]=> - NULL -} -- Sort flag = SORT_REGULAR - -bool(true) -array(11) { - ["\xhh"]=> - string(4) "\xhh" - ["\ddd"]=> - string(4) "\ddd" - ["\cx"]=> - string(3) "\cx" - ["\a"]=> - string(2) "\a" - [""]=> - string(1) "" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [""]=> - NULL -} -- Sort flag = SORT_STRING - -bool(true) -array(11) { - ["\xhh"]=> - string(4) "\xhh" - ["\ddd"]=> - string(4) "\ddd" - ["\cx"]=> - string(3) "\cx" - ["\a"]=> - string(2) "\a" - [""]=> - string(1) "" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [""]=> - NULL -} - --- Iteration 2 -- -- With default sort flag - -bool(true) -array(11) { - ["x"]=> - string(1) "X" - ["te"]=> - string(4) "Test" - ["t"]=> - string(4) "TTTT" - ["o"]=> - string(6) "Orange" - ["X"]=> - string(1) "x" - ["W"]=> - string(2) "ww" - ["T"]=> - string(3) "ttt" - ["O"]=> - string(6) "oraNGe" - ["Lemon"]=> - string(5) "lemoN" - ["B"]=> - string(6) "BANANA" - ["Apple"]=> - string(5) "apple" -} -- Sort flag = SORT_REGULAR - -bool(true) -array(11) { - ["x"]=> - string(1) "X" - ["te"]=> - string(4) "Test" - ["t"]=> - string(4) "TTTT" - ["o"]=> - string(6) "Orange" - ["X"]=> - string(1) "x" - ["W"]=> - string(2) "ww" - ["T"]=> - string(3) "ttt" - ["O"]=> - string(6) "oraNGe" - ["Lemon"]=> - string(5) "lemoN" - ["B"]=> - string(6) "BANANA" - ["Apple"]=> - string(5) "apple" -} -- Sort flag = SORT_STRING - -bool(true) -array(11) { - ["x"]=> - string(1) "X" - ["te"]=> - string(4) "Test" - ["t"]=> - string(4) "TTTT" - ["o"]=> - string(6) "Orange" - ["X"]=> - string(1) "x" - ["W"]=> - string(2) "ww" - ["T"]=> - string(3) "ttt" - ["O"]=> - string(6) "oraNGe" - ["Lemon"]=> - string(5) "lemoN" - ["B"]=> - string(6) "BANANA" - ["Apple"]=> - string(5) "apple" -} -Done diff --git a/ext/standard/tests/array/ksort_variation5.phpt b/ext/standard/tests/array/ksort_variation5.phpt deleted file mode 100644 index 0538043744228..0000000000000 --- a/ext/standard/tests/array/ksort_variation5.phpt +++ /dev/null @@ -1,225 +0,0 @@ ---TEST-- -Test ksort() function : usage variations - sort strings ---FILE-- - null, NULL => NULL, "\a" => "\a", "\cx" => "\cx", "\e" => "\e", - "\f" => "\f", "\n" =>"\n", "\r" => "\r", "\t" => "\t", "\xhh" => "\xhh", - "\ddd" => "\ddd", "\v" => "\v" - ), - - // array containing different strings with key values - array ( 'Lemon' => "lemoN", 'o' => "Orange", 'B' => "banana", 'Apple' => "apple", 'te' => "Test", - 't' => "TTTT", 'T' => "ttt", 'W' => "ww", 'X' => "x", 'x' => "X", 'O' => "oraNGe", - 'B' => "BANANA" - ) -); - -$flags = array("SORT_REGULAR" => SORT_REGULAR, "SORT_STRING" => SORT_STRING); - -$count = 1; -echo "\n-- Testing ksort() by supplying various string arrays --\n"; - -// loop through to test ksort() with different arrays -foreach ($various_arrays as $array) { - echo "\n-- Iteration $count --\n"; - - echo "- With default sort flag -\n"; - $temp_array = $array; - var_dump(ksort($temp_array) ); // expecting : bool(true) - var_dump($temp_array); - - // loop through $flags array and call ksort() with all possible sort flag values - foreach($flags as $key => $flag){ - echo "- Sort flag = $key -\n"; - $temp_array = $array; - var_dump(ksort($temp_array, $flag) ); // expecting : bool(true) - var_dump($temp_array); - } - $count++; -} - -echo "Done\n"; -?> ---EXPECT-- -*** Testing ksort() : usage variations *** - --- Testing ksort() by supplying various string arrays -- - --- Iteration 1 -- -- With default sort flag - -bool(true) -array(11) { - [""]=> - NULL - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [""]=> - string(1) "" - ["\a"]=> - string(2) "\a" - ["\cx"]=> - string(3) "\cx" - ["\ddd"]=> - string(4) "\ddd" - ["\xhh"]=> - string(4) "\xhh" -} -- Sort flag = SORT_REGULAR - -bool(true) -array(11) { - [""]=> - NULL - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [""]=> - string(1) "" - ["\a"]=> - string(2) "\a" - ["\cx"]=> - string(3) "\cx" - ["\ddd"]=> - string(4) "\ddd" - ["\xhh"]=> - string(4) "\xhh" -} -- Sort flag = SORT_STRING - -bool(true) -array(11) { - [""]=> - NULL - [" "]=> - string(1) " " - [" -"]=> - string(1) " -" - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [" "]=> - string(1) " " - [""]=> - string(1) "" - ["\a"]=> - string(2) "\a" - ["\cx"]=> - string(3) "\cx" - ["\ddd"]=> - string(4) "\ddd" - ["\xhh"]=> - string(4) "\xhh" -} - --- Iteration 2 -- -- With default sort flag - -bool(true) -array(11) { - ["Apple"]=> - string(5) "apple" - ["B"]=> - string(6) "BANANA" - ["Lemon"]=> - string(5) "lemoN" - ["O"]=> - string(6) "oraNGe" - ["T"]=> - string(3) "ttt" - ["W"]=> - string(2) "ww" - ["X"]=> - string(1) "x" - ["o"]=> - string(6) "Orange" - ["t"]=> - string(4) "TTTT" - ["te"]=> - string(4) "Test" - ["x"]=> - string(1) "X" -} -- Sort flag = SORT_REGULAR - -bool(true) -array(11) { - ["Apple"]=> - string(5) "apple" - ["B"]=> - string(6) "BANANA" - ["Lemon"]=> - string(5) "lemoN" - ["O"]=> - string(6) "oraNGe" - ["T"]=> - string(3) "ttt" - ["W"]=> - string(2) "ww" - ["X"]=> - string(1) "x" - ["o"]=> - string(6) "Orange" - ["t"]=> - string(4) "TTTT" - ["te"]=> - string(4) "Test" - ["x"]=> - string(1) "X" -} -- Sort flag = SORT_STRING - -bool(true) -array(11) { - ["Apple"]=> - string(5) "apple" - ["B"]=> - string(6) "BANANA" - ["Lemon"]=> - string(5) "lemoN" - ["O"]=> - string(6) "oraNGe" - ["T"]=> - string(3) "ttt" - ["W"]=> - string(2) "ww" - ["X"]=> - string(1) "x" - ["o"]=> - string(6) "Orange" - ["t"]=> - string(4) "TTTT" - ["te"]=> - string(4) "Test" - ["x"]=> - string(1) "X" -} -Done diff --git a/ext/standard/tests/array/rsort_variation5.phpt b/ext/standard/tests/array/rsort_variation5.phpt deleted file mode 100644 index 6b05443b520bd..0000000000000 --- a/ext/standard/tests/array/rsort_variation5.phpt +++ /dev/null @@ -1,215 +0,0 @@ ---TEST-- -Test rsort() function : usage variations - String values ---FILE-- - SORT_REGULAR, "SORT_STRING" => SORT_STRING); - -$count = 1; -// loop through to test rsort() with different arrays -foreach ($various_arrays as $array) { - echo "\n-- Iteration $count --\n"; - - echo "- With Default sort flag -\n"; - $temp_array = $array; - var_dump(rsort($temp_array) ); - var_dump($temp_array); - - // loop through $flags array and setting all possible flag values - foreach($flags as $key => $flag){ - echo "- Sort flag = $key -\n"; - - $temp_array = $array; - var_dump(rsort($temp_array, $flag) ); - var_dump($temp_array); - } - $count++; -} - -echo "Done"; -?> ---EXPECT-- -*** Testing rsort() : variation *** - --- Iteration 1 -- -- With Default sort flag - -bool(true) -array(11) { - [0]=> - string(4) "\xhh" - [1]=> - string(4) "\ddd" - [2]=> - string(3) "\cx" - [3]=> - string(2) "\a" - [4]=> - string(1) "" - [5]=> - string(1) " " - [6]=> - string(1) " " - [7]=> - string(1) " -" - [8]=> - string(1) " " - [9]=> - NULL - [10]=> - NULL -} -- Sort flag = SORT_REGULAR - -bool(true) -array(11) { - [0]=> - string(4) "\xhh" - [1]=> - string(4) "\ddd" - [2]=> - string(3) "\cx" - [3]=> - string(2) "\a" - [4]=> - string(1) "" - [5]=> - string(1) " " - [6]=> - string(1) " " - [7]=> - string(1) " -" - [8]=> - string(1) " " - [9]=> - NULL - [10]=> - NULL -} -- Sort flag = SORT_STRING - -bool(true) -array(11) { - [0]=> - string(4) "\xhh" - [1]=> - string(4) "\ddd" - [2]=> - string(3) "\cx" - [3]=> - string(2) "\a" - [4]=> - string(1) "" - [5]=> - string(1) " " - [6]=> - string(1) " " - [7]=> - string(1) " -" - [8]=> - string(1) " " - [9]=> - NULL - [10]=> - NULL -} - --- Iteration 2 -- -- With Default sort flag - -bool(true) -array(12) { - [0]=> - string(1) "x" - [1]=> - string(2) "ww" - [2]=> - string(3) "ttt" - [3]=> - string(6) "oraNGe" - [4]=> - string(5) "lemoN" - [5]=> - string(6) "banana" - [6]=> - string(5) "apple" - [7]=> - string(1) "X" - [8]=> - string(4) "Test" - [9]=> - string(4) "TTTT" - [10]=> - string(6) "Orange" - [11]=> - string(6) "BANANA" -} -- Sort flag = SORT_REGULAR - -bool(true) -array(12) { - [0]=> - string(1) "x" - [1]=> - string(2) "ww" - [2]=> - string(3) "ttt" - [3]=> - string(6) "oraNGe" - [4]=> - string(5) "lemoN" - [5]=> - string(6) "banana" - [6]=> - string(5) "apple" - [7]=> - string(1) "X" - [8]=> - string(4) "Test" - [9]=> - string(4) "TTTT" - [10]=> - string(6) "Orange" - [11]=> - string(6) "BANANA" -} -- Sort flag = SORT_STRING - -bool(true) -array(12) { - [0]=> - string(1) "x" - [1]=> - string(2) "ww" - [2]=> - string(3) "ttt" - [3]=> - string(6) "oraNGe" - [4]=> - string(5) "lemoN" - [5]=> - string(6) "banana" - [6]=> - string(5) "apple" - [7]=> - string(1) "X" - [8]=> - string(4) "Test" - [9]=> - string(4) "TTTT" - [10]=> - string(6) "Orange" - [11]=> - string(6) "BANANA" -} -Done diff --git a/ext/standard/tests/array/array_multisort_basic1.phpt b/ext/standard/tests/array/sort/array_multisort_basic1.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_basic1.phpt rename to ext/standard/tests/array/sort/array_multisort_basic1.phpt diff --git a/ext/standard/tests/array/array_multisort_basic2.phpt b/ext/standard/tests/array/sort/array_multisort_basic2.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_basic2.phpt rename to ext/standard/tests/array/sort/array_multisort_basic2.phpt diff --git a/ext/standard/tests/array/array_multisort_case.phpt b/ext/standard/tests/array/sort/array_multisort_case.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_case.phpt rename to ext/standard/tests/array/sort/array_multisort_case.phpt diff --git a/ext/standard/tests/array/array_multisort_error.phpt b/ext/standard/tests/array/sort/array_multisort_error.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_error.phpt rename to ext/standard/tests/array/sort/array_multisort_error.phpt diff --git a/ext/standard/tests/array/array_multisort_incase.phpt b/ext/standard/tests/array/sort/array_multisort_incase.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_incase.phpt rename to ext/standard/tests/array/sort/array_multisort_incase.phpt diff --git a/ext/standard/tests/array/array_multisort_natural.phpt b/ext/standard/tests/array/sort/array_multisort_natural.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_natural.phpt rename to ext/standard/tests/array/sort/array_multisort_natural.phpt diff --git a/ext/standard/tests/array/array_multisort_natural_case.phpt b/ext/standard/tests/array/sort/array_multisort_natural_case.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_natural_case.phpt rename to ext/standard/tests/array/sort/array_multisort_natural_case.phpt diff --git a/ext/standard/tests/array/array_multisort_natural_incase.phpt b/ext/standard/tests/array/sort/array_multisort_natural_incase.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_natural_incase.phpt rename to ext/standard/tests/array/sort/array_multisort_natural_incase.phpt diff --git a/ext/standard/tests/array/array_multisort_stability.phpt b/ext/standard/tests/array/sort/array_multisort_stability.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_stability.phpt rename to ext/standard/tests/array/sort/array_multisort_stability.phpt diff --git a/ext/standard/tests/array/array_multisort_variation1.phpt b/ext/standard/tests/array/sort/array_multisort_variation1.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation1.phpt rename to ext/standard/tests/array/sort/array_multisort_variation1.phpt diff --git a/ext/standard/tests/array/array_multisort_variation10.phpt b/ext/standard/tests/array/sort/array_multisort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation10.phpt rename to ext/standard/tests/array/sort/array_multisort_variation10.phpt diff --git a/ext/standard/tests/array/array_multisort_variation11.phpt b/ext/standard/tests/array/sort/array_multisort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation11.phpt rename to ext/standard/tests/array/sort/array_multisort_variation11.phpt diff --git a/ext/standard/tests/array/array_multisort_variation2.phpt b/ext/standard/tests/array/sort/array_multisort_variation2.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation2.phpt rename to ext/standard/tests/array/sort/array_multisort_variation2.phpt diff --git a/ext/standard/tests/array/array_multisort_variation3.phpt b/ext/standard/tests/array/sort/array_multisort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation3.phpt rename to ext/standard/tests/array/sort/array_multisort_variation3.phpt diff --git a/ext/standard/tests/array/array_multisort_variation4.phpt b/ext/standard/tests/array/sort/array_multisort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation4.phpt rename to ext/standard/tests/array/sort/array_multisort_variation4.phpt diff --git a/ext/standard/tests/array/array_multisort_variation5.phpt b/ext/standard/tests/array/sort/array_multisort_variation5.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation5.phpt rename to ext/standard/tests/array/sort/array_multisort_variation5.phpt diff --git a/ext/standard/tests/array/array_multisort_variation6.phpt b/ext/standard/tests/array/sort/array_multisort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation6.phpt rename to ext/standard/tests/array/sort/array_multisort_variation6.phpt diff --git a/ext/standard/tests/array/array_multisort_variation7.phpt b/ext/standard/tests/array/sort/array_multisort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation7.phpt rename to ext/standard/tests/array/sort/array_multisort_variation7.phpt diff --git a/ext/standard/tests/array/array_multisort_variation8.phpt b/ext/standard/tests/array/sort/array_multisort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation8.phpt rename to ext/standard/tests/array/sort/array_multisort_variation8.phpt diff --git a/ext/standard/tests/array/array_multisort_variation9.phpt b/ext/standard/tests/array/sort/array_multisort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/array_multisort_variation9.phpt rename to ext/standard/tests/array/sort/array_multisort_variation9.phpt diff --git a/ext/standard/tests/array/array_shuffle_basic.phpt b/ext/standard/tests/array/sort/array_shuffle_basic.phpt similarity index 100% rename from ext/standard/tests/array/array_shuffle_basic.phpt rename to ext/standard/tests/array/sort/array_shuffle_basic.phpt diff --git a/ext/standard/tests/array/arsort_basic.phpt b/ext/standard/tests/array/sort/arsort_basic.phpt similarity index 100% rename from ext/standard/tests/array/arsort_basic.phpt rename to ext/standard/tests/array/sort/arsort_basic.phpt diff --git a/ext/standard/tests/array/arsort_object1.phpt b/ext/standard/tests/array/sort/arsort_object1.phpt similarity index 100% rename from ext/standard/tests/array/arsort_object1.phpt rename to ext/standard/tests/array/sort/arsort_object1.phpt diff --git a/ext/standard/tests/array/arsort_object2.phpt b/ext/standard/tests/array/sort/arsort_object2.phpt similarity index 100% rename from ext/standard/tests/array/arsort_object2.phpt rename to ext/standard/tests/array/sort/arsort_object2.phpt diff --git a/ext/standard/tests/array/arsort_variation10.phpt b/ext/standard/tests/array/sort/arsort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation10.phpt rename to ext/standard/tests/array/sort/arsort_variation10.phpt diff --git a/ext/standard/tests/array/arsort_variation11.phpt b/ext/standard/tests/array/sort/arsort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation11.phpt rename to ext/standard/tests/array/sort/arsort_variation11.phpt diff --git a/ext/standard/tests/array/arsort_variation3.phpt b/ext/standard/tests/array/sort/arsort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation3.phpt rename to ext/standard/tests/array/sort/arsort_variation3.phpt diff --git a/ext/standard/tests/array/arsort_variation4.phpt b/ext/standard/tests/array/sort/arsort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation4.phpt rename to ext/standard/tests/array/sort/arsort_variation4.phpt diff --git a/ext/standard/tests/array/sort/arsort_variation5.phpt b/ext/standard/tests/array/sort/arsort_variation5.phpt new file mode 100644 index 0000000000000..08c70d8e07ddb --- /dev/null +++ b/ext/standard/tests/array/sort/arsort_variation5.phpt @@ -0,0 +1,121 @@ +--TEST-- +Test arsort() function : usage variations - sort strings +--FILE-- + "lemoN", + "Orange" => "Orange", + "banana" => "banana", + "apple" => "apple", + "Test" => "Test", + "TTTT" => "TTTT", + "ttt" => "ttt", + "ww" => "ww", + "x" => "x", + "X" => "X", + "oraNGe" => "oraNGe", + "BANANA" => "BANANA", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(arsort($temp_array)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(arsort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(arsort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array); + +?> +--EXPECT-- +Default flag +bool(true) +array(12) { + ["x"]=> + string(1) "x" + ["ww"]=> + string(2) "ww" + ["ttt"]=> + string(3) "ttt" + ["oraNGe"]=> + string(6) "oraNGe" + ["lemoN"]=> + string(5) "lemoN" + ["banana"]=> + string(6) "banana" + ["apple"]=> + string(5) "apple" + ["X"]=> + string(1) "X" + ["Test"]=> + string(4) "Test" + ["TTTT"]=> + string(4) "TTTT" + ["Orange"]=> + string(6) "Orange" + ["BANANA"]=> + string(6) "BANANA" +} +SORT_REGULAR +bool(true) +array(12) { + ["x"]=> + string(1) "x" + ["ww"]=> + string(2) "ww" + ["ttt"]=> + string(3) "ttt" + ["oraNGe"]=> + string(6) "oraNGe" + ["lemoN"]=> + string(5) "lemoN" + ["banana"]=> + string(6) "banana" + ["apple"]=> + string(5) "apple" + ["X"]=> + string(1) "X" + ["Test"]=> + string(4) "Test" + ["TTTT"]=> + string(4) "TTTT" + ["Orange"]=> + string(6) "Orange" + ["BANANA"]=> + string(6) "BANANA" +} +SORT_STRING +bool(true) +array(12) { + ["x"]=> + string(1) "x" + ["ww"]=> + string(2) "ww" + ["ttt"]=> + string(3) "ttt" + ["oraNGe"]=> + string(6) "oraNGe" + ["lemoN"]=> + string(5) "lemoN" + ["banana"]=> + string(6) "banana" + ["apple"]=> + string(5) "apple" + ["X"]=> + string(1) "X" + ["Test"]=> + string(4) "Test" + ["TTTT"]=> + string(4) "TTTT" + ["Orange"]=> + string(6) "Orange" + ["BANANA"]=> + string(6) "BANANA" +} diff --git a/ext/standard/tests/array/arsort_variation6.phpt b/ext/standard/tests/array/sort/arsort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation6.phpt rename to ext/standard/tests/array/sort/arsort_variation6.phpt diff --git a/ext/standard/tests/array/arsort_variation7.phpt b/ext/standard/tests/array/sort/arsort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation7.phpt rename to ext/standard/tests/array/sort/arsort_variation7.phpt diff --git a/ext/standard/tests/array/arsort_variation8.phpt b/ext/standard/tests/array/sort/arsort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation8.phpt rename to ext/standard/tests/array/sort/arsort_variation8.phpt diff --git a/ext/standard/tests/array/arsort_variation9.phpt b/ext/standard/tests/array/sort/arsort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/arsort_variation9.phpt rename to ext/standard/tests/array/sort/arsort_variation9.phpt diff --git a/ext/standard/tests/array/sort/arsort_variation_escape_sequences.phpt b/ext/standard/tests/array/sort/arsort_variation_escape_sequences.phpt new file mode 100644 index 0000000000000..b4a533c42114c --- /dev/null +++ b/ext/standard/tests/array/sort/arsort_variation_escape_sequences.phpt @@ -0,0 +1,59 @@ +--TEST-- +Test arsort() function: sorting escape sequences +--FILE-- + "\xhh", + "\ddd" => "\ddd", + "\cx" => "\cx", + "\a" => "\a", + "\e" => "\e", + "\r" => "\r", + "\f" => "\f", + "\v" => "\v", + "\n" => "\n", + "\t" => "\t", + null => null, +]; + +$array = [ + null => null, + "\a" => "\a", + "\cx" => "\cx", + "\e" => "\e", + "\f" => "\f", + "\n" => "\n", + "\r" => "\r", + "\t" => "\t", + "\xhh" => "\xhh", + "\ddd" => "\ddd", + "\v" => "\v", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(arsort($temp_array)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(arsort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(arsort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +?> +--EXPECT-- +Default flag +bool(true) +bool(true) +SORT_REGULAR +bool(true) +bool(true) +SORT_STRING +bool(true) +bool(true) diff --git a/ext/standard/tests/array/asort_basic.phpt b/ext/standard/tests/array/sort/asort_basic.phpt similarity index 100% rename from ext/standard/tests/array/asort_basic.phpt rename to ext/standard/tests/array/sort/asort_basic.phpt diff --git a/ext/standard/tests/array/asort_object1.phpt b/ext/standard/tests/array/sort/asort_object1.phpt similarity index 100% rename from ext/standard/tests/array/asort_object1.phpt rename to ext/standard/tests/array/sort/asort_object1.phpt diff --git a/ext/standard/tests/array/asort_object2.phpt b/ext/standard/tests/array/sort/asort_object2.phpt similarity index 100% rename from ext/standard/tests/array/asort_object2.phpt rename to ext/standard/tests/array/sort/asort_object2.phpt diff --git a/ext/standard/tests/array/asort_stability.phpt b/ext/standard/tests/array/sort/asort_stability.phpt similarity index 100% rename from ext/standard/tests/array/asort_stability.phpt rename to ext/standard/tests/array/sort/asort_stability.phpt diff --git a/ext/standard/tests/array/asort_variation10.phpt b/ext/standard/tests/array/sort/asort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation10.phpt rename to ext/standard/tests/array/sort/asort_variation10.phpt diff --git a/ext/standard/tests/array/asort_variation11.phpt b/ext/standard/tests/array/sort/asort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation11.phpt rename to ext/standard/tests/array/sort/asort_variation11.phpt diff --git a/ext/standard/tests/array/asort_variation3.phpt b/ext/standard/tests/array/sort/asort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation3.phpt rename to ext/standard/tests/array/sort/asort_variation3.phpt diff --git a/ext/standard/tests/array/asort_variation4.phpt b/ext/standard/tests/array/sort/asort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation4.phpt rename to ext/standard/tests/array/sort/asort_variation4.phpt diff --git a/ext/standard/tests/array/sort/asort_variation5.phpt b/ext/standard/tests/array/sort/asort_variation5.phpt new file mode 100644 index 0000000000000..d5a8930f090c3 --- /dev/null +++ b/ext/standard/tests/array/sort/asort_variation5.phpt @@ -0,0 +1,121 @@ +--TEST-- +Test asort() function : usage variations - sort strings +--FILE-- + "lemoN", + "Orange" => "Orange", + "banana" => "banana", + "apple" => "apple", + "Test" => "Test", + "TTTT" => "TTTT", + "ttt" => "ttt", + "ww" => "ww", + "x" => "x", + "X" => "X", + "oraNGe" => "oraNGe", + "BANANA" => "BANANA", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(asort($temp_array)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(asort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(asort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array); + +?> +--EXPECT-- +Default flag +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} +SORT_REGULAR +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} +SORT_STRING +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} \ No newline at end of file diff --git a/ext/standard/tests/array/asort_variation6.phpt b/ext/standard/tests/array/sort/asort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation6.phpt rename to ext/standard/tests/array/sort/asort_variation6.phpt diff --git a/ext/standard/tests/array/asort_variation7.phpt b/ext/standard/tests/array/sort/asort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation7.phpt rename to ext/standard/tests/array/sort/asort_variation7.phpt diff --git a/ext/standard/tests/array/asort_variation8.phpt b/ext/standard/tests/array/sort/asort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation8.phpt rename to ext/standard/tests/array/sort/asort_variation8.phpt diff --git a/ext/standard/tests/array/asort_variation9.phpt b/ext/standard/tests/array/sort/asort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/asort_variation9.phpt rename to ext/standard/tests/array/sort/asort_variation9.phpt diff --git a/ext/standard/tests/array/sort/asort_variation_escape_sequences.phpt b/ext/standard/tests/array/sort/asort_variation_escape_sequences.phpt new file mode 100644 index 0000000000000..6de02b66ae0a6 --- /dev/null +++ b/ext/standard/tests/array/sort/asort_variation_escape_sequences.phpt @@ -0,0 +1,59 @@ +--TEST-- +Test asort() function: sorting escape sequences +--FILE-- + null, + "\t" => "\t", + "\n" => "\n", + "\v" => "\v", + "\f" => "\f", + "\r" => "\r", + "\e" => "\e", + "\a" => "\a", + "\cx" => "\cx", + "\ddd" => "\ddd", + "\xhh" => "\xhh", +]; + +$array = [ + null => null, + "\a" => "\a", + "\cx" => "\cx", + "\e" => "\e", + "\f" => "\f", + "\n" => "\n", + "\r" => "\r", + "\t" => "\t", + "\xhh" => "\xhh", + "\ddd" => "\ddd", + "\v" => "\v", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(asort($temp_array)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(asort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(asort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +?> +--EXPECT-- +Default flag +bool(true) +bool(true) +SORT_REGULAR +bool(true) +bool(true) +SORT_STRING +bool(true) +bool(true) diff --git a/ext/standard/tests/array/bug24897.phpt b/ext/standard/tests/array/sort/bug24897.phpt similarity index 100% rename from ext/standard/tests/array/bug24897.phpt rename to ext/standard/tests/array/sort/bug24897.phpt diff --git a/ext/standard/tests/array/bug25359.phpt b/ext/standard/tests/array/sort/bug25359.phpt similarity index 100% rename from ext/standard/tests/array/bug25359.phpt rename to ext/standard/tests/array/sort/bug25359.phpt diff --git a/ext/standard/tests/array/bug33382.phpt b/ext/standard/tests/array/sort/bug33382.phpt similarity index 100% rename from ext/standard/tests/array/bug33382.phpt rename to ext/standard/tests/array/sort/bug33382.phpt diff --git a/ext/standard/tests/array/bug36975.phpt b/ext/standard/tests/array/sort/bug36975.phpt similarity index 100% rename from ext/standard/tests/array/bug36975.phpt rename to ext/standard/tests/array/sort/bug36975.phpt diff --git a/ext/standard/tests/array/bug44929.phpt b/ext/standard/tests/array/sort/bug44929.phpt similarity index 100% rename from ext/standard/tests/array/bug44929.phpt rename to ext/standard/tests/array/sort/bug44929.phpt diff --git a/ext/standard/tests/array/bug50006.phpt b/ext/standard/tests/array/sort/bug50006.phpt similarity index 100% rename from ext/standard/tests/array/bug50006.phpt rename to ext/standard/tests/array/sort/bug50006.phpt diff --git a/ext/standard/tests/array/bug50006_1.phpt b/ext/standard/tests/array/sort/bug50006_1.phpt similarity index 100% rename from ext/standard/tests/array/bug50006_1.phpt rename to ext/standard/tests/array/sort/bug50006_1.phpt diff --git a/ext/standard/tests/array/bug50006_2.phpt b/ext/standard/tests/array/sort/bug50006_2.phpt similarity index 100% rename from ext/standard/tests/array/bug50006_2.phpt rename to ext/standard/tests/array/sort/bug50006_2.phpt diff --git a/ext/standard/tests/array/bug71334.phpt b/ext/standard/tests/array/sort/bug71334.phpt similarity index 100% rename from ext/standard/tests/array/bug71334.phpt rename to ext/standard/tests/array/sort/bug71334.phpt diff --git a/ext/standard/tests/array/bug77395.phpt b/ext/standard/tests/array/sort/bug77395.phpt similarity index 100% rename from ext/standard/tests/array/bug77395.phpt rename to ext/standard/tests/array/sort/bug77395.phpt diff --git a/ext/standard/tests/array/data.inc b/ext/standard/tests/array/sort/data.inc similarity index 100% rename from ext/standard/tests/array/data.inc rename to ext/standard/tests/array/sort/data.inc diff --git a/ext/standard/tests/array/gh9296.phpt b/ext/standard/tests/array/sort/gh9296.phpt similarity index 100% rename from ext/standard/tests/array/gh9296.phpt rename to ext/standard/tests/array/sort/gh9296.phpt diff --git a/ext/standard/tests/array/002.phpt b/ext/standard/tests/array/sort/internal_sorts_basic.phpt similarity index 100% rename from ext/standard/tests/array/002.phpt rename to ext/standard/tests/array/sort/internal_sorts_basic.phpt diff --git a/ext/standard/tests/array/krsort_basic.phpt b/ext/standard/tests/array/sort/krsort_basic.phpt similarity index 100% rename from ext/standard/tests/array/krsort_basic.phpt rename to ext/standard/tests/array/sort/krsort_basic.phpt diff --git a/ext/standard/tests/array/krsort_object.phpt b/ext/standard/tests/array/sort/krsort_object.phpt similarity index 100% rename from ext/standard/tests/array/krsort_object.phpt rename to ext/standard/tests/array/sort/krsort_object.phpt diff --git a/ext/standard/tests/array/krsort_variation10.phpt b/ext/standard/tests/array/sort/krsort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation10.phpt rename to ext/standard/tests/array/sort/krsort_variation10.phpt diff --git a/ext/standard/tests/array/krsort_variation11.phpt b/ext/standard/tests/array/sort/krsort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation11.phpt rename to ext/standard/tests/array/sort/krsort_variation11.phpt diff --git a/ext/standard/tests/array/krsort_variation3.phpt b/ext/standard/tests/array/sort/krsort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation3.phpt rename to ext/standard/tests/array/sort/krsort_variation3.phpt diff --git a/ext/standard/tests/array/krsort_variation4.phpt b/ext/standard/tests/array/sort/krsort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation4.phpt rename to ext/standard/tests/array/sort/krsort_variation4.phpt diff --git a/ext/standard/tests/array/sort/krsort_variation5.phpt b/ext/standard/tests/array/sort/krsort_variation5.phpt new file mode 100644 index 0000000000000..b1fe5897f16c9 --- /dev/null +++ b/ext/standard/tests/array/sort/krsort_variation5.phpt @@ -0,0 +1,121 @@ +--TEST-- +Test krsort() function : usage variations - sort strings +--FILE-- + "lemoN", + "Orange" => "Orange", + "banana" => "banana", + "apple" => "apple", + "Test" => "Test", + "TTTT" => "TTTT", + "ttt" => "ttt", + "ww" => "ww", + "x" => "x", + "X" => "X", + "oraNGe" => "oraNGe", + "BANANA" => "BANANA", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(ksort($temp_array)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(ksort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(ksort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array); + +?> +--EXPECT-- +Default flag +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} +SORT_REGULAR +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} +SORT_STRING +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} diff --git a/ext/standard/tests/array/krsort_variation6.phpt b/ext/standard/tests/array/sort/krsort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation6.phpt rename to ext/standard/tests/array/sort/krsort_variation6.phpt diff --git a/ext/standard/tests/array/krsort_variation7.phpt b/ext/standard/tests/array/sort/krsort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation7.phpt rename to ext/standard/tests/array/sort/krsort_variation7.phpt diff --git a/ext/standard/tests/array/krsort_variation8.phpt b/ext/standard/tests/array/sort/krsort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation8.phpt rename to ext/standard/tests/array/sort/krsort_variation8.phpt diff --git a/ext/standard/tests/array/krsort_variation9.phpt b/ext/standard/tests/array/sort/krsort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/krsort_variation9.phpt rename to ext/standard/tests/array/sort/krsort_variation9.phpt diff --git a/ext/standard/tests/array/sort/krsort_variation_escape_sequences.phpt b/ext/standard/tests/array/sort/krsort_variation_escape_sequences.phpt new file mode 100644 index 0000000000000..ac56df76ed7ca --- /dev/null +++ b/ext/standard/tests/array/sort/krsort_variation_escape_sequences.phpt @@ -0,0 +1,59 @@ +--TEST-- +Test krsort() function: sorting escape sequences +--FILE-- + "\xhh", + "\ddd" => "\ddd", + "\cx" => "\cx", + "\a" => "\a", + "\e" => "\e", + "\r" => "\r", + "\f" => "\f", + "\v" => "\v", + "\n" => "\n", + "\t" => "\t", + null => null, +]; + +$array = [ + null => null, + "\a" => "\a", + "\cx" => "\cx", + "\e" => "\e", + "\f" => "\f", + "\n" => "\n", + "\r" => "\r", + "\t" => "\t", + "\xhh" => "\xhh", + "\ddd" => "\ddd", + "\v" => "\v", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(krsort($temp_array)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(krsort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(krsort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +?> +--EXPECT-- +Default flag +bool(true) +bool(true) +SORT_REGULAR +bool(true) +bool(true) +SORT_STRING +bool(true) +bool(true) diff --git a/ext/standard/tests/array/ksort_basic.phpt b/ext/standard/tests/array/sort/ksort_basic.phpt similarity index 100% rename from ext/standard/tests/array/ksort_basic.phpt rename to ext/standard/tests/array/sort/ksort_basic.phpt diff --git a/ext/standard/tests/array/ksort_object.phpt b/ext/standard/tests/array/sort/ksort_object.phpt similarity index 100% rename from ext/standard/tests/array/ksort_object.phpt rename to ext/standard/tests/array/sort/ksort_object.phpt diff --git a/ext/standard/tests/array/ksort_variation10.phpt b/ext/standard/tests/array/sort/ksort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation10.phpt rename to ext/standard/tests/array/sort/ksort_variation10.phpt diff --git a/ext/standard/tests/array/ksort_variation11.phpt b/ext/standard/tests/array/sort/ksort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation11.phpt rename to ext/standard/tests/array/sort/ksort_variation11.phpt diff --git a/ext/standard/tests/array/ksort_variation3.phpt b/ext/standard/tests/array/sort/ksort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation3.phpt rename to ext/standard/tests/array/sort/ksort_variation3.phpt diff --git a/ext/standard/tests/array/ksort_variation4.phpt b/ext/standard/tests/array/sort/ksort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation4.phpt rename to ext/standard/tests/array/sort/ksort_variation4.phpt diff --git a/ext/standard/tests/array/sort/ksort_variation5.phpt b/ext/standard/tests/array/sort/ksort_variation5.phpt new file mode 100644 index 0000000000000..f69b0b14d5d05 --- /dev/null +++ b/ext/standard/tests/array/sort/ksort_variation5.phpt @@ -0,0 +1,121 @@ +--TEST-- +Test ksort() function : usage variations - sort strings +--FILE-- + "lemoN", + "Orange" => "Orange", + "banana" => "banana", + "apple" => "apple", + "Test" => "Test", + "TTTT" => "TTTT", + "ttt" => "ttt", + "ww" => "ww", + "x" => "x", + "X" => "X", + "oraNGe" => "oraNGe", + "BANANA" => "BANANA", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(ksort($temp_array)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(ksort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(ksort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array); + +?> +--EXPECT-- +Default flag +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} +SORT_REGULAR +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} +SORT_STRING +bool(true) +array(12) { + ["BANANA"]=> + string(6) "BANANA" + ["Orange"]=> + string(6) "Orange" + ["TTTT"]=> + string(4) "TTTT" + ["Test"]=> + string(4) "Test" + ["X"]=> + string(1) "X" + ["apple"]=> + string(5) "apple" + ["banana"]=> + string(6) "banana" + ["lemoN"]=> + string(5) "lemoN" + ["oraNGe"]=> + string(6) "oraNGe" + ["ttt"]=> + string(3) "ttt" + ["ww"]=> + string(2) "ww" + ["x"]=> + string(1) "x" +} diff --git a/ext/standard/tests/array/ksort_variation6.phpt b/ext/standard/tests/array/sort/ksort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation6.phpt rename to ext/standard/tests/array/sort/ksort_variation6.phpt diff --git a/ext/standard/tests/array/ksort_variation7.phpt b/ext/standard/tests/array/sort/ksort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation7.phpt rename to ext/standard/tests/array/sort/ksort_variation7.phpt diff --git a/ext/standard/tests/array/ksort_variation8.phpt b/ext/standard/tests/array/sort/ksort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation8.phpt rename to ext/standard/tests/array/sort/ksort_variation8.phpt diff --git a/ext/standard/tests/array/ksort_variation9.phpt b/ext/standard/tests/array/sort/ksort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/ksort_variation9.phpt rename to ext/standard/tests/array/sort/ksort_variation9.phpt diff --git a/ext/standard/tests/array/sort/ksort_variation_escape_sequences.phpt b/ext/standard/tests/array/sort/ksort_variation_escape_sequences.phpt new file mode 100644 index 0000000000000..e880227b1c9e0 --- /dev/null +++ b/ext/standard/tests/array/sort/ksort_variation_escape_sequences.phpt @@ -0,0 +1,59 @@ +--TEST-- +Test ksort() function: sorting escape sequences +--FILE-- + null, + "\t" => "\t", + "\n" => "\n", + "\v" => "\v", + "\f" => "\f", + "\r" => "\r", + "\e" => "\e", + "\a" => "\a", + "\cx" => "\cx", + "\ddd" => "\ddd", + "\xhh" => "\xhh", +]; + +$array = [ + null => null, + "\a" => "\a", + "\cx" => "\cx", + "\e" => "\e", + "\f" => "\f", + "\n" => "\n", + "\r" => "\r", + "\t" => "\t", + "\xhh" => "\xhh", + "\ddd" => "\ddd", + "\v" => "\v", +]; + +echo "Default flag\n"; +$temp_array = $array; +var_dump(ksort($temp_array)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_REGULAR\n"; +$temp_array = $array; +var_dump(ksort($temp_array, SORT_REGULAR)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +echo "SORT_STRING\n"; +$temp_array = $array; +var_dump(ksort($temp_array, SORT_STRING)); // expecting : bool(true) +var_dump($temp_array === EXPECTED_RESULT); + +?> +--EXPECT-- +Default flag +bool(true) +bool(true) +SORT_REGULAR +bool(true) +bool(true) +SORT_STRING +bool(true) +bool(true) diff --git a/ext/standard/tests/array/locale_sort.phpt b/ext/standard/tests/array/sort/locale_sort.phpt similarity index 100% rename from ext/standard/tests/array/locale_sort.phpt rename to ext/standard/tests/array/sort/locale_sort.phpt diff --git a/ext/standard/tests/array/natcasesort_basic.phpt b/ext/standard/tests/array/sort/natcasesort_basic.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_basic.phpt rename to ext/standard/tests/array/sort/natcasesort_basic.phpt diff --git a/ext/standard/tests/array/natcasesort_object1.phpt b/ext/standard/tests/array/sort/natcasesort_object1.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_object1.phpt rename to ext/standard/tests/array/sort/natcasesort_object1.phpt diff --git a/ext/standard/tests/array/natcasesort_object2.phpt b/ext/standard/tests/array/sort/natcasesort_object2.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_object2.phpt rename to ext/standard/tests/array/sort/natcasesort_object2.phpt diff --git a/ext/standard/tests/array/natcasesort_variation10.phpt b/ext/standard/tests/array/sort/natcasesort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation10.phpt rename to ext/standard/tests/array/sort/natcasesort_variation10.phpt diff --git a/ext/standard/tests/array/natcasesort_variation11.phpt b/ext/standard/tests/array/sort/natcasesort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation11.phpt rename to ext/standard/tests/array/sort/natcasesort_variation11.phpt diff --git a/ext/standard/tests/array/natcasesort_variation2.phpt b/ext/standard/tests/array/sort/natcasesort_variation2.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation2.phpt rename to ext/standard/tests/array/sort/natcasesort_variation2.phpt diff --git a/ext/standard/tests/array/natcasesort_variation3.phpt b/ext/standard/tests/array/sort/natcasesort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation3.phpt rename to ext/standard/tests/array/sort/natcasesort_variation3.phpt diff --git a/ext/standard/tests/array/natcasesort_variation4.phpt b/ext/standard/tests/array/sort/natcasesort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation4.phpt rename to ext/standard/tests/array/sort/natcasesort_variation4.phpt diff --git a/ext/standard/tests/array/natcasesort_variation5.phpt b/ext/standard/tests/array/sort/natcasesort_variation5.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation5.phpt rename to ext/standard/tests/array/sort/natcasesort_variation5.phpt diff --git a/ext/standard/tests/array/natcasesort_variation6.phpt b/ext/standard/tests/array/sort/natcasesort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation6.phpt rename to ext/standard/tests/array/sort/natcasesort_variation6.phpt diff --git a/ext/standard/tests/array/natcasesort_variation7.phpt b/ext/standard/tests/array/sort/natcasesort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation7.phpt rename to ext/standard/tests/array/sort/natcasesort_variation7.phpt diff --git a/ext/standard/tests/array/natcasesort_variation8.phpt b/ext/standard/tests/array/sort/natcasesort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation8.phpt rename to ext/standard/tests/array/sort/natcasesort_variation8.phpt diff --git a/ext/standard/tests/array/natcasesort_variation9.phpt b/ext/standard/tests/array/sort/natcasesort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/natcasesort_variation9.phpt rename to ext/standard/tests/array/sort/natcasesort_variation9.phpt diff --git a/ext/standard/tests/array/natsort_basic.phpt b/ext/standard/tests/array/sort/natsort_basic.phpt similarity index 100% rename from ext/standard/tests/array/natsort_basic.phpt rename to ext/standard/tests/array/sort/natsort_basic.phpt diff --git a/ext/standard/tests/array/004.phpt b/ext/standard/tests/array/sort/natsort_natcasesort_basics.phpt similarity index 100% rename from ext/standard/tests/array/004.phpt rename to ext/standard/tests/array/sort/natsort_natcasesort_basics.phpt diff --git a/ext/standard/tests/array/rsort_basic.phpt b/ext/standard/tests/array/sort/rsort_basic.phpt similarity index 100% rename from ext/standard/tests/array/rsort_basic.phpt rename to ext/standard/tests/array/sort/rsort_basic.phpt diff --git a/ext/standard/tests/array/rsort_object1.phpt b/ext/standard/tests/array/sort/rsort_object1.phpt similarity index 100% rename from ext/standard/tests/array/rsort_object1.phpt rename to ext/standard/tests/array/sort/rsort_object1.phpt diff --git a/ext/standard/tests/array/rsort_object2.phpt b/ext/standard/tests/array/sort/rsort_object2.phpt similarity index 100% rename from ext/standard/tests/array/rsort_object2.phpt rename to ext/standard/tests/array/sort/rsort_object2.phpt diff --git a/ext/standard/tests/array/rsort_variation10.phpt b/ext/standard/tests/array/sort/rsort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation10.phpt rename to ext/standard/tests/array/sort/rsort_variation10.phpt diff --git a/ext/standard/tests/array/rsort_variation11.phpt b/ext/standard/tests/array/sort/rsort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation11.phpt rename to ext/standard/tests/array/sort/rsort_variation11.phpt diff --git a/ext/standard/tests/array/rsort_variation3.phpt b/ext/standard/tests/array/sort/rsort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation3.phpt rename to ext/standard/tests/array/sort/rsort_variation3.phpt diff --git a/ext/standard/tests/array/rsort_variation4.phpt b/ext/standard/tests/array/sort/rsort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation4.phpt rename to ext/standard/tests/array/sort/rsort_variation4.phpt diff --git a/ext/standard/tests/array/sort/rsort_variation5.phpt b/ext/standard/tests/array/sort/rsort_variation5.phpt new file mode 100644 index 0000000000000..c4dd3f6a9ce70 --- /dev/null +++ b/ext/standard/tests/array/sort/rsort_variation5.phpt @@ -0,0 +1,121 @@ +--TEST-- +Test rsort() function : usage variations - String values +--FILE-- + +--EXPECT-- +Default flag +bool(true) +array(12) { + [0]=> + string(6) "BANANA" + [1]=> + string(6) "Orange" + [2]=> + string(4) "TTTT" + [3]=> + string(4) "Test" + [4]=> + string(1) "X" + [5]=> + string(5) "apple" + [6]=> + string(6) "banana" + [7]=> + string(5) "lemoN" + [8]=> + string(6) "oraNGe" + [9]=> + string(3) "ttt" + [10]=> + string(2) "ww" + [11]=> + string(1) "x" +} +SORT_REGULAR +bool(true) +array(12) { + [0]=> + string(6) "BANANA" + [1]=> + string(6) "Orange" + [2]=> + string(4) "TTTT" + [3]=> + string(4) "Test" + [4]=> + string(1) "X" + [5]=> + string(5) "apple" + [6]=> + string(6) "banana" + [7]=> + string(5) "lemoN" + [8]=> + string(6) "oraNGe" + [9]=> + string(3) "ttt" + [10]=> + string(2) "ww" + [11]=> + string(1) "x" +} +SORT_STRING +bool(true) +array(12) { + [0]=> + string(6) "BANANA" + [1]=> + string(6) "Orange" + [2]=> + string(4) "TTTT" + [3]=> + string(4) "Test" + [4]=> + string(1) "X" + [5]=> + string(5) "apple" + [6]=> + string(6) "banana" + [7]=> + string(5) "lemoN" + [8]=> + string(6) "oraNGe" + [9]=> + string(3) "ttt" + [10]=> + string(2) "ww" + [11]=> + string(1) "x" +} diff --git a/ext/standard/tests/array/rsort_variation6.phpt b/ext/standard/tests/array/sort/rsort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation6.phpt rename to ext/standard/tests/array/sort/rsort_variation6.phpt diff --git a/ext/standard/tests/array/rsort_variation7.phpt b/ext/standard/tests/array/sort/rsort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation7.phpt rename to ext/standard/tests/array/sort/rsort_variation7.phpt diff --git a/ext/standard/tests/array/rsort_variation8.phpt b/ext/standard/tests/array/sort/rsort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation8.phpt rename to ext/standard/tests/array/sort/rsort_variation8.phpt diff --git a/ext/standard/tests/array/rsort_variation9.phpt b/ext/standard/tests/array/sort/rsort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/rsort_variation9.phpt rename to ext/standard/tests/array/sort/rsort_variation9.phpt diff --git a/ext/standard/tests/array/sort/rsort_variation_escape_sequences.phpt b/ext/standard/tests/array/sort/rsort_variation_escape_sequences.phpt new file mode 100644 index 0000000000000..57edbe66e1514 --- /dev/null +++ b/ext/standard/tests/array/sort/rsort_variation_escape_sequences.phpt @@ -0,0 +1,59 @@ +--TEST-- +Test rsort() function: sorting escape sequences +--FILE-- + +--EXPECT-- +Default flag +bool(true) +bool(true) +SORT_REGULAR +bool(true) +bool(true) +SORT_STRING +bool(true) +bool(true) diff --git a/ext/standard/tests/array/shuffle_basic1.phpt b/ext/standard/tests/array/sort/shuffle_basic1.phpt similarity index 100% rename from ext/standard/tests/array/shuffle_basic1.phpt rename to ext/standard/tests/array/sort/shuffle_basic1.phpt diff --git a/ext/standard/tests/array/shuffle_basic2.phpt b/ext/standard/tests/array/sort/shuffle_basic2.phpt similarity index 100% rename from ext/standard/tests/array/shuffle_basic2.phpt rename to ext/standard/tests/array/sort/shuffle_basic2.phpt diff --git a/ext/standard/tests/array/shuffle_variation2.phpt b/ext/standard/tests/array/sort/shuffle_variation2.phpt similarity index 100% rename from ext/standard/tests/array/shuffle_variation2.phpt rename to ext/standard/tests/array/sort/shuffle_variation2.phpt diff --git a/ext/standard/tests/array/shuffle_variation3.phpt b/ext/standard/tests/array/sort/shuffle_variation3.phpt similarity index 100% rename from ext/standard/tests/array/shuffle_variation3.phpt rename to ext/standard/tests/array/sort/shuffle_variation3.phpt diff --git a/ext/standard/tests/array/shuffle_variation4.phpt b/ext/standard/tests/array/sort/shuffle_variation4.phpt similarity index 100% rename from ext/standard/tests/array/shuffle_variation4.phpt rename to ext/standard/tests/array/sort/shuffle_variation4.phpt diff --git a/ext/standard/tests/array/shuffle_variation5.phpt b/ext/standard/tests/array/sort/shuffle_variation5.phpt similarity index 100% rename from ext/standard/tests/array/shuffle_variation5.phpt rename to ext/standard/tests/array/sort/shuffle_variation5.phpt diff --git a/ext/standard/tests/array/sort_basic.phpt b/ext/standard/tests/array/sort/sort_basic.phpt similarity index 100% rename from ext/standard/tests/array/sort_basic.phpt rename to ext/standard/tests/array/sort/sort_basic.phpt diff --git a/ext/standard/tests/array/sort_object1.phpt b/ext/standard/tests/array/sort/sort_object1.phpt similarity index 100% rename from ext/standard/tests/array/sort_object1.phpt rename to ext/standard/tests/array/sort/sort_object1.phpt diff --git a/ext/standard/tests/array/sort_object2.phpt b/ext/standard/tests/array/sort/sort_object2.phpt similarity index 100% rename from ext/standard/tests/array/sort_object2.phpt rename to ext/standard/tests/array/sort/sort_object2.phpt diff --git a/ext/standard/tests/array/sort_variation10.phpt b/ext/standard/tests/array/sort/sort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation10.phpt rename to ext/standard/tests/array/sort/sort_variation10.phpt diff --git a/ext/standard/tests/array/sort_variation11.phpt b/ext/standard/tests/array/sort/sort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation11.phpt rename to ext/standard/tests/array/sort/sort_variation11.phpt diff --git a/ext/standard/tests/array/sort_variation3.phpt b/ext/standard/tests/array/sort/sort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation3.phpt rename to ext/standard/tests/array/sort/sort_variation3.phpt diff --git a/ext/standard/tests/array/sort_variation4.phpt b/ext/standard/tests/array/sort/sort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation4.phpt rename to ext/standard/tests/array/sort/sort_variation4.phpt diff --git a/ext/standard/tests/array/sort/sort_variation5.phpt b/ext/standard/tests/array/sort/sort_variation5.phpt new file mode 100644 index 0000000000000..c9e369f4a2807 --- /dev/null +++ b/ext/standard/tests/array/sort/sort_variation5.phpt @@ -0,0 +1,121 @@ +--TEST-- +Test sort() function : usage variations - sort strings +--FILE-- + +--EXPECT-- +Default flag +bool(true) +array(12) { + [0]=> + string(6) "BANANA" + [1]=> + string(6) "Orange" + [2]=> + string(4) "TTTT" + [3]=> + string(4) "Test" + [4]=> + string(1) "X" + [5]=> + string(5) "apple" + [6]=> + string(6) "banana" + [7]=> + string(5) "lemoN" + [8]=> + string(6) "oraNGe" + [9]=> + string(3) "ttt" + [10]=> + string(2) "ww" + [11]=> + string(1) "x" +} +SORT_REGULAR +bool(true) +array(12) { + [0]=> + string(6) "BANANA" + [1]=> + string(6) "Orange" + [2]=> + string(4) "TTTT" + [3]=> + string(4) "Test" + [4]=> + string(1) "X" + [5]=> + string(5) "apple" + [6]=> + string(6) "banana" + [7]=> + string(5) "lemoN" + [8]=> + string(6) "oraNGe" + [9]=> + string(3) "ttt" + [10]=> + string(2) "ww" + [11]=> + string(1) "x" +} +SORT_STRING +bool(true) +array(12) { + [0]=> + string(6) "BANANA" + [1]=> + string(6) "Orange" + [2]=> + string(4) "TTTT" + [3]=> + string(4) "Test" + [4]=> + string(1) "X" + [5]=> + string(5) "apple" + [6]=> + string(6) "banana" + [7]=> + string(5) "lemoN" + [8]=> + string(6) "oraNGe" + [9]=> + string(3) "ttt" + [10]=> + string(2) "ww" + [11]=> + string(1) "x" +} diff --git a/ext/standard/tests/array/sort_variation6.phpt b/ext/standard/tests/array/sort/sort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation6.phpt rename to ext/standard/tests/array/sort/sort_variation6.phpt diff --git a/ext/standard/tests/array/sort_variation7.phpt b/ext/standard/tests/array/sort/sort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation7.phpt rename to ext/standard/tests/array/sort/sort_variation7.phpt diff --git a/ext/standard/tests/array/sort_variation8.phpt b/ext/standard/tests/array/sort/sort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation8.phpt rename to ext/standard/tests/array/sort/sort_variation8.phpt diff --git a/ext/standard/tests/array/sort_variation9.phpt b/ext/standard/tests/array/sort/sort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/sort_variation9.phpt rename to ext/standard/tests/array/sort/sort_variation9.phpt diff --git a/ext/standard/tests/array/sort/sort_variation_escape_sequences.phpt b/ext/standard/tests/array/sort/sort_variation_escape_sequences.phpt new file mode 100644 index 0000000000000..e824a6f7e9c9f --- /dev/null +++ b/ext/standard/tests/array/sort/sort_variation_escape_sequences.phpt @@ -0,0 +1,59 @@ +--TEST-- +Test sort() function: sorting escape sequences +--FILE-- + +--EXPECT-- +Default flag +bool(true) +bool(true) +SORT_REGULAR +bool(true) +bool(true) +SORT_STRING +bool(true) +bool(true) diff --git a/ext/standard/tests/array/uasort_basic1.phpt b/ext/standard/tests/array/sort/uasort_basic1.phpt similarity index 100% rename from ext/standard/tests/array/uasort_basic1.phpt rename to ext/standard/tests/array/sort/uasort_basic1.phpt diff --git a/ext/standard/tests/array/uasort_basic2.phpt b/ext/standard/tests/array/sort/uasort_basic2.phpt similarity index 100% rename from ext/standard/tests/array/uasort_basic2.phpt rename to ext/standard/tests/array/sort/uasort_basic2.phpt diff --git a/ext/standard/tests/array/uasort_object1.phpt b/ext/standard/tests/array/sort/uasort_object1.phpt similarity index 100% rename from ext/standard/tests/array/uasort_object1.phpt rename to ext/standard/tests/array/sort/uasort_object1.phpt diff --git a/ext/standard/tests/array/uasort_object2.phpt b/ext/standard/tests/array/sort/uasort_object2.phpt similarity index 100% rename from ext/standard/tests/array/uasort_object2.phpt rename to ext/standard/tests/array/sort/uasort_object2.phpt diff --git a/ext/standard/tests/array/uasort_variation10.phpt b/ext/standard/tests/array/sort/uasort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation10.phpt rename to ext/standard/tests/array/sort/uasort_variation10.phpt diff --git a/ext/standard/tests/array/uasort_variation11.phpt b/ext/standard/tests/array/sort/uasort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation11.phpt rename to ext/standard/tests/array/sort/uasort_variation11.phpt diff --git a/ext/standard/tests/array/uasort_variation3.phpt b/ext/standard/tests/array/sort/uasort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation3.phpt rename to ext/standard/tests/array/sort/uasort_variation3.phpt diff --git a/ext/standard/tests/array/uasort_variation4.phpt b/ext/standard/tests/array/sort/uasort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation4.phpt rename to ext/standard/tests/array/sort/uasort_variation4.phpt diff --git a/ext/standard/tests/array/uasort_variation5.phpt b/ext/standard/tests/array/sort/uasort_variation5.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation5.phpt rename to ext/standard/tests/array/sort/uasort_variation5.phpt diff --git a/ext/standard/tests/array/uasort_variation6.phpt b/ext/standard/tests/array/sort/uasort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation6.phpt rename to ext/standard/tests/array/sort/uasort_variation6.phpt diff --git a/ext/standard/tests/array/uasort_variation7.phpt b/ext/standard/tests/array/sort/uasort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation7.phpt rename to ext/standard/tests/array/sort/uasort_variation7.phpt diff --git a/ext/standard/tests/array/uasort_variation8.phpt b/ext/standard/tests/array/sort/uasort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/uasort_variation8.phpt rename to ext/standard/tests/array/sort/uasort_variation8.phpt diff --git a/ext/standard/tests/array/uksort_basic.phpt b/ext/standard/tests/array/sort/uksort_basic.phpt similarity index 100% rename from ext/standard/tests/array/uksort_basic.phpt rename to ext/standard/tests/array/sort/uksort_basic.phpt diff --git a/ext/standard/tests/array/003.phpt b/ext/standard/tests/array/sort/user_sort_basics.phpt similarity index 100% rename from ext/standard/tests/array/003.phpt rename to ext/standard/tests/array/sort/user_sort_basics.phpt diff --git a/ext/standard/tests/array/usort_basic.phpt b/ext/standard/tests/array/sort/usort_basic.phpt similarity index 100% rename from ext/standard/tests/array/usort_basic.phpt rename to ext/standard/tests/array/sort/usort_basic.phpt diff --git a/ext/standard/tests/array/usort_object1.phpt b/ext/standard/tests/array/sort/usort_object1.phpt similarity index 100% rename from ext/standard/tests/array/usort_object1.phpt rename to ext/standard/tests/array/sort/usort_object1.phpt diff --git a/ext/standard/tests/array/usort_object2.phpt b/ext/standard/tests/array/sort/usort_object2.phpt similarity index 100% rename from ext/standard/tests/array/usort_object2.phpt rename to ext/standard/tests/array/sort/usort_object2.phpt diff --git a/ext/standard/tests/array/usort_stability.phpt b/ext/standard/tests/array/sort/usort_stability.phpt similarity index 100% rename from ext/standard/tests/array/usort_stability.phpt rename to ext/standard/tests/array/sort/usort_stability.phpt diff --git a/ext/standard/tests/array/usort_variation10.phpt b/ext/standard/tests/array/sort/usort_variation10.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation10.phpt rename to ext/standard/tests/array/sort/usort_variation10.phpt diff --git a/ext/standard/tests/array/usort_variation11.phpt b/ext/standard/tests/array/sort/usort_variation11.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation11.phpt rename to ext/standard/tests/array/sort/usort_variation11.phpt diff --git a/ext/standard/tests/array/usort_variation3.phpt b/ext/standard/tests/array/sort/usort_variation3.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation3.phpt rename to ext/standard/tests/array/sort/usort_variation3.phpt diff --git a/ext/standard/tests/array/usort_variation4.phpt b/ext/standard/tests/array/sort/usort_variation4.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation4.phpt rename to ext/standard/tests/array/sort/usort_variation4.phpt diff --git a/ext/standard/tests/array/usort_variation5.phpt b/ext/standard/tests/array/sort/usort_variation5.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation5.phpt rename to ext/standard/tests/array/sort/usort_variation5.phpt diff --git a/ext/standard/tests/array/usort_variation6.phpt b/ext/standard/tests/array/sort/usort_variation6.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation6.phpt rename to ext/standard/tests/array/sort/usort_variation6.phpt diff --git a/ext/standard/tests/array/usort_variation7.phpt b/ext/standard/tests/array/sort/usort_variation7.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation7.phpt rename to ext/standard/tests/array/sort/usort_variation7.phpt diff --git a/ext/standard/tests/array/usort_variation8.phpt b/ext/standard/tests/array/sort/usort_variation8.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation8.phpt rename to ext/standard/tests/array/sort/usort_variation8.phpt diff --git a/ext/standard/tests/array/usort_variation9.phpt b/ext/standard/tests/array/sort/usort_variation9.phpt similarity index 100% rename from ext/standard/tests/array/usort_variation9.phpt rename to ext/standard/tests/array/sort/usort_variation9.phpt diff --git a/ext/standard/tests/array/sort_variation5.phpt b/ext/standard/tests/array/sort_variation5.phpt deleted file mode 100644 index 6c49342df25d8..0000000000000 --- a/ext/standard/tests/array/sort_variation5.phpt +++ /dev/null @@ -1,227 +0,0 @@ ---TEST-- -Test sort() function : usage variations - sort strings ---FILE-- - SORT_REGULAR, "SORT_STRING" => SORT_STRING); - -$count = 1; -echo "\n-- Testing sort() by supplying various string arrays --\n"; - -// loop through to test sort() with different arrays -foreach ($various_arrays as $array) { - echo "\n-- Iteration $count --\n"; - - echo "- With Default sort flag -\n"; - $temp_array = $array; - var_dump(sort($temp_array) ); // expecting : bool(true) - var_dump($temp_array); - - // loop through $flags array and setting all possible flag values - foreach($flags as $key => $flag){ - echo "- Sort flag = $key -\n"; - $temp_array = $array; - var_dump(sort($temp_array, $flag) ); // expecting : bool(true) - var_dump($temp_array); - } - $count++; -} - -echo "Done\n"; -?> ---EXPECT-- -*** Testing sort() : usage variations *** - --- Testing sort() by supplying various string arrays -- - --- Iteration 1 -- -- With Default sort flag - -bool(true) -array(12) { - [0]=> - NULL - [1]=> - NULL - [2]=> - string(1) " " - [3]=> - string(1) " -" - [4]=> - string(1) " " - [5]=> - string(1) " " - [6]=> - string(1) " " - [7]=> - string(1) "" - [8]=> - string(2) "\a" - [9]=> - string(3) "\cx" - [10]=> - string(4) "\ddd" - [11]=> - string(4) "\xhh" -} -- Sort flag = SORT_REGULAR - -bool(true) -array(12) { - [0]=> - NULL - [1]=> - NULL - [2]=> - string(1) " " - [3]=> - string(1) " -" - [4]=> - string(1) " " - [5]=> - string(1) " " - [6]=> - string(1) " " - [7]=> - string(1) "" - [8]=> - string(2) "\a" - [9]=> - string(3) "\cx" - [10]=> - string(4) "\ddd" - [11]=> - string(4) "\xhh" -} -- Sort flag = SORT_STRING - -bool(true) -array(12) { - [0]=> - NULL - [1]=> - NULL - [2]=> - string(1) " " - [3]=> - string(1) " -" - [4]=> - string(1) " " - [5]=> - string(1) " " - [6]=> - string(1) " " - [7]=> - string(1) "" - [8]=> - string(2) "\a" - [9]=> - string(3) "\cx" - [10]=> - string(4) "\ddd" - [11]=> - string(4) "\xhh" -} - --- Iteration 2 -- -- With Default sort flag - -bool(true) -array(12) { - [0]=> - string(6) "BANANA" - [1]=> - string(6) "Orange" - [2]=> - string(4) "TTTT" - [3]=> - string(4) "Test" - [4]=> - string(1) "X" - [5]=> - string(5) "apple" - [6]=> - string(6) "banana" - [7]=> - string(5) "lemoN" - [8]=> - string(6) "oraNGe" - [9]=> - string(3) "ttt" - [10]=> - string(2) "ww" - [11]=> - string(1) "x" -} -- Sort flag = SORT_REGULAR - -bool(true) -array(12) { - [0]=> - string(6) "BANANA" - [1]=> - string(6) "Orange" - [2]=> - string(4) "TTTT" - [3]=> - string(4) "Test" - [4]=> - string(1) "X" - [5]=> - string(5) "apple" - [6]=> - string(6) "banana" - [7]=> - string(5) "lemoN" - [8]=> - string(6) "oraNGe" - [9]=> - string(3) "ttt" - [10]=> - string(2) "ww" - [11]=> - string(1) "x" -} -- Sort flag = SORT_STRING - -bool(true) -array(12) { - [0]=> - string(6) "BANANA" - [1]=> - string(6) "Orange" - [2]=> - string(4) "TTTT" - [3]=> - string(4) "Test" - [4]=> - string(1) "X" - [5]=> - string(5) "apple" - [6]=> - string(6) "banana" - [7]=> - string(5) "lemoN" - [8]=> - string(6) "oraNGe" - [9]=> - string(3) "ttt" - [10]=> - string(2) "ww" - [11]=> - string(1) "x" -} -Done diff --git a/ext/standard/tests/crypt/des_fallback_invalid_salt.phpt b/ext/standard/tests/crypt/des_fallback_invalid_salt.phpt index b0797657d80a2..8b00c81bbd1ce 100644 --- a/ext/standard/tests/crypt/des_fallback_invalid_salt.phpt +++ b/ext/standard/tests/crypt/des_fallback_invalid_salt.phpt @@ -3,8 +3,11 @@ Test DES with invalid fallback --FILE-- --EXPECT-- diff --git a/ext/standard/tests/directory/gh10992.phpt b/ext/standard/tests/directory/gh10992.phpt new file mode 100644 index 0000000000000..99ac8a5ecd290 --- /dev/null +++ b/ext/standard/tests/directory/gh10992.phpt @@ -0,0 +1,16 @@ +--TEST-- +GH-10992 (Improper long path support for relative paths) +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/standard/tests/strings/crypt_sha256.phpt b/ext/standard/tests/strings/crypt_sha256.phpt index 095e8f1691336..324248294be72 100644 --- a/ext/standard/tests/strings/crypt_sha256.phpt +++ b/ext/standard/tests/strings/crypt_sha256.phpt @@ -39,12 +39,10 @@ $tests = array( 'a short string', '$5$rounds=123456$asaltof16chars..$gP3VQ/6X7UUEW3HkBn2w1/Ptq2jxPyzV/cZKmF/wJvD' ), + + // The "too many rounds" behavior depends on the crypt() + // implementation, but for now everyone agrees on what to do. 8 => array( - '$5$rounds=10$roundstoolow', - 'the number of rounds is too low', - '*0' - ), - 9 => array( '$5$rounds=1000000000$roundstoohigh', 'the number of rounds is too high', '*0' diff --git a/sapi/fpm/fpm/fpm_status.c b/sapi/fpm/fpm/fpm_status.c index cbf8644d99cab..cc3412149c7b5 100644 --- a/sapi/fpm/fpm/fpm_status.c +++ b/sapi/fpm/fpm/fpm_status.c @@ -62,7 +62,8 @@ int fpm_status_export_to_zval(zval *status) /* copy the scoreboard not to bother other processes */ scoreboard = *scoreboard_p; - struct fpm_scoreboard_proc_s procs[scoreboard.nprocs]; + struct fpm_scoreboard_proc_s *procs = safe_emalloc( + sizeof(struct fpm_scoreboard_proc_s), scoreboard.nprocs, 0); struct fpm_scoreboard_proc_s *proc_p; for(i=0; i +--FILE-- +createSourceFileAndScriptName(); +$tester->start(); +$tester->expectLogStartNotices(); +$tester->request()->expectBody('bool(false)'); +$tester->terminate(); +$tester->expectLogTerminatingNotices(); +$tester->close(); + +?> +Done +--EXPECT-- +Done +--CLEAN-- + diff --git a/scripts/dev/credits b/scripts/dev/credits index e59cc109b88d7..783bc5f18f79d 100755 --- a/scripts/dev/credits +++ b/scripts/dev/credits @@ -3,7 +3,7 @@ # Generate credits_*.h headers from the ext/*/CREDITS and sapi/*/CREDITS files. # Go to project root directory -cd $(CDPATH= cd -- "$(dirname -- "$0")/../../" && pwd -P) +cd "$(CDPATH='' cd -- "$(dirname -- "$0")/../../" && pwd -P)" || exit awkprog=' BEGIN { FS = "\n|\r\n|\r"; RS = "" } diff --git a/scripts/dev/genfiles b/scripts/dev/genfiles index 3e6c1271578c9..124a10de34581 100755 --- a/scripts/dev/genfiles +++ b/scripts/dev/genfiles @@ -42,7 +42,7 @@ SED=${SED:-sed} MAKE=${MAKE:-make} # Go to project root. -cd $(CDPATH= cd -- "$(dirname -- "$0")/../../" && pwd -P) +cd "$(CDPATH='' cd -- "$(dirname -- "$0")/../../" && pwd -P)" || exit # Check required bison version from the configure.ac file. required_bison_version=$($SED -n 's/PHP_PROG_BISON(\[\([0-9\.]*\)\].*/\1/p' configure.ac) diff --git a/scripts/dev/makedist b/scripts/dev/makedist index 48e54cffaaf79..9417515fe1d8b 100755 --- a/scripts/dev/makedist +++ b/scripts/dev/makedist @@ -23,7 +23,7 @@ if [[ $($tar --version) == *"bsdtar"* ]]; then fi # Go to project root directory. -cd $(CDPATH= cd -- "$(dirname -- "$0")/../../" && pwd -P) +cd "$(CDPATH='' cd -- "$(dirname -- "$0")/../../" && pwd -P)" || exit # Process options and arguments. while :; do diff --git a/win32/ioutil.c b/win32/ioutil.c index acd4103c613b1..9c313d6001be1 100644 --- a/win32/ioutil.c +++ b/win32/ioutil.c @@ -281,7 +281,7 @@ PW32IO int php_win32_ioutil_close(int fd) PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode) {/*{{{*/ - size_t path_len; + size_t path_len, dir_len = 0; const wchar_t *my_path; if (!path) { @@ -292,7 +292,16 @@ PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode) PHP_WIN32_IOUTIL_CHECK_PATH_W(path, -1, 0) path_len = wcslen(path); - if (path_len < _MAX_PATH && path_len >= _MAX_PATH - 12) { +#ifndef ZTS + if (!PHP_WIN32_IOUTIL_IS_ABSOLUTEW(path, path_len) && !PHP_WIN32_IOUTIL_IS_JUNCTION_PATHW(path, path_len) && !PHP_WIN32_IOUTIL_IS_UNC_PATHW(path, path_len)) { + dir_len = GetCurrentDirectoryW(0, NULL); + if (dir_len == 0) { + return -1; + } + } +#endif + + if (dir_len + path_len < _MAX_PATH && dir_len + path_len >= _MAX_PATH - 12) { /* Special case here. From the doc: "When using an API to create a directory, the specified path cannot be @@ -315,7 +324,7 @@ PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode) } if (!PHP_WIN32_IOUTIL_IS_LONG_PATHW(tmp, path_len)) { - wchar_t *_tmp = (wchar_t *) malloc((path_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t)); + wchar_t *_tmp = (wchar_t *) malloc((dir_len + path_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t)); wchar_t *src, *dst; if (!_tmp) { SET_ERRNO_FROM_WIN32_CODE(ERROR_NOT_ENOUGH_MEMORY); @@ -325,6 +334,18 @@ PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode) memmove(_tmp, PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW, PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof(wchar_t)); src = tmp; dst = _tmp + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW; +#ifndef ZTS + if (dir_len > 0) { + size_t len = GetCurrentDirectoryW(dir_len, dst); + if (len == 0 || len + 1 != dir_len) { + free(tmp); + free(_tmp); + return -1; + } + dst += len; + *dst++ = PHP_WIN32_IOUTIL_DEFAULT_SLASHW; + } +#endif while (src < tmp + path_len) { if (*src == PHP_WIN32_IOUTIL_FW_SLASHW) { *dst++ = PHP_WIN32_IOUTIL_DEFAULT_SLASHW; @@ -333,7 +354,7 @@ PW32IO int php_win32_ioutil_mkdir_w(const wchar_t *path, mode_t mode) *dst++ = *src++; } } - path_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW; + path_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + dir_len; _tmp[path_len] = L'\0'; free(tmp); tmp = _tmp; diff --git a/win32/ioutil.h b/win32/ioutil.h index 6a7055fc71a77..454efdc353648 100644 --- a/win32/ioutil.h +++ b/win32/ioutil.h @@ -175,18 +175,28 @@ PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w(w __forceinline static wchar_t *php_win32_ioutil_conv_any_to_w(const char* in, size_t in_len, size_t *out_len) {/*{{{*/ wchar_t *mb, *ret; - size_t mb_len; + size_t mb_len, dir_len = 0; mb = php_win32_cp_conv_any_to_w(in, in_len, &mb_len); if (!mb) { return NULL; } +#ifndef ZTS + if (!PHP_WIN32_IOUTIL_IS_ABSOLUTEW(mb, mb_len) && !PHP_WIN32_IOUTIL_IS_JUNCTION_PATHW(mb, mb_len) && !PHP_WIN32_IOUTIL_IS_UNC_PATHW(mb, mb_len)) { + dir_len = GetCurrentDirectoryW(0, NULL); + if (dir_len == 0) { + free(mb); + return NULL; + } + } +#endif + /* Only prefix with long if it's needed. */ - if (mb_len >= _MAX_PATH) { + if (dir_len + mb_len >= _MAX_PATH) { size_t new_mb_len; - ret = (wchar_t *) malloc((mb_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t)); + ret = (wchar_t *) malloc((dir_len + mb_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + 1) * sizeof(wchar_t)); if (!ret) { free(mb); return NULL; @@ -199,7 +209,7 @@ __forceinline static wchar_t *php_win32_ioutil_conv_any_to_w(const char* in, siz } if (new_mb_len > mb_len) { - wchar_t *tmp = (wchar_t *) realloc(ret, (new_mb_len + 1) * sizeof(wchar_t)); + wchar_t *tmp = (wchar_t *) realloc(ret, (dir_len + new_mb_len + 1) * sizeof(wchar_t)); if (!tmp) { free(ret); free(mb); @@ -215,6 +225,18 @@ __forceinline static wchar_t *php_win32_ioutil_conv_any_to_w(const char* in, siz } else { wchar_t *src = mb, *dst = ret + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW; memmove(ret, PHP_WIN32_IOUTIL_LONG_PATH_PREFIXW, PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW * sizeof(wchar_t)); +#ifndef ZTS + if (dir_len > 0) { + size_t len = GetCurrentDirectoryW(dir_len, dst); + if (len == 0 || len + 1 != dir_len) { + free(ret); + free(mb); + return NULL; + } + dst += len; + *dst++ = PHP_WIN32_IOUTIL_DEFAULT_SLASHW; + } +#endif while (src < mb + mb_len) { if (*src == PHP_WIN32_IOUTIL_FW_SLASHW) { *dst++ = PHP_WIN32_IOUTIL_DEFAULT_SLASHW; @@ -223,9 +245,9 @@ __forceinline static wchar_t *php_win32_ioutil_conv_any_to_w(const char* in, siz *dst++ = *src++; } } - ret[mb_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW] = L'\0'; + ret[mb_len + PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + dir_len] = L'\0'; - mb_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW; + mb_len += PHP_WIN32_IOUTIL_LONG_PATH_PREFIX_LENW + dir_len; } free(mb);