From fae07f0115b6d1a000bb319fb5d2e29cee6d06ee Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Tue, 5 Aug 2025 15:17:39 +0200 Subject: [PATCH 1/2] Throw ValueError when a wrong flag value is provided to the second argument of `scandir()` --- NEWS | 2 + ext/standard/dir.c | 8 ++- .../tests/dir/scandir_invalid_flag.phpt | 12 ++++ .../dir/scandir_variation9-win32-mb.phpt | 71 ------------------- .../tests/dir/scandir_variation9.phpt | 65 ----------------- 5 files changed, 20 insertions(+), 138 deletions(-) create mode 100644 ext/standard/tests/dir/scandir_invalid_flag.phpt delete mode 100644 ext/standard/tests/dir/scandir_variation9-win32-mb.phpt delete mode 100644 ext/standard/tests/dir/scandir_variation9.phpt diff --git a/NEWS b/NEWS index d688ef5aad399..bd0699728c61f 100644 --- a/NEWS +++ b/NEWS @@ -148,6 +148,8 @@ PHP NEWS . Add enum SortDirection. (timwolla) . pathinfo() raises a ValueError with an invalid $flags argument. (David Carlier) + . Passing an invalid flag value to the second argument of scandir() will now + throw a ValueError. (alexandre-daubois) - Streams: . Added so_keepalive, tcp_keepidle, tcp_keepintvl and tcp_keepcnt stream diff --git a/ext/standard/dir.c b/ext/standard/dir.c index 730ef6154907e..487ddfe8fd56f 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -588,9 +588,13 @@ PHP_FUNCTION(scandir) n = php_stream_scandir(dirn, &namelist, context, (void *) php_stream_dirent_alphasort); } else if (flags == PHP_SCANDIR_SORT_NONE) { n = php_stream_scandir(dirn, &namelist, context, NULL); - } else { + } else if (flags == PHP_SCANDIR_SORT_DESCENDING) { n = php_stream_scandir(dirn, &namelist, context, (void *) php_stream_dirent_alphasortr); - } + } else { + zend_argument_value_error(2, "must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING and SCANDIR_SORT_NONE constants"); + RETURN_THROWS(); + } + if (n < 0) { php_error_docref(NULL, E_WARNING, "(errno %d): %s", errno, strerror(errno)); RETURN_FALSE; diff --git a/ext/standard/tests/dir/scandir_invalid_flag.phpt b/ext/standard/tests/dir/scandir_invalid_flag.phpt new file mode 100644 index 0000000000000..1cde17c75d5bb --- /dev/null +++ b/ext/standard/tests/dir/scandir_invalid_flag.phpt @@ -0,0 +1,12 @@ +--TEST-- +Provide wrong flags to scandir() +--FILE-- +getMessage() . "\n"; +} +?> +--EXPECT-- +scandir(): Argument #2 ($sorting_order) must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING and SCANDIR_SORT_NONE constants diff --git a/ext/standard/tests/dir/scandir_variation9-win32-mb.phpt b/ext/standard/tests/dir/scandir_variation9-win32-mb.phpt deleted file mode 100644 index 44d8b6daa5f9e..0000000000000 --- a/ext/standard/tests/dir/scandir_variation9-win32-mb.phpt +++ /dev/null @@ -1,71 +0,0 @@ ---TEST-- -Test scandir() function : usage variations - different ints as $sorting_order arg ---SKIPIF-- - ---FILE-- - ---CLEAN-- - ---EXPECT-- -*** Testing scandir() : usage variations *** -array(4) { - [0]=> - string(45) "私はガラスを食べられますfile2.tmp" - [1]=> - string(45) "私はガラスを食べられますfile1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(45) "私はガラスを食べられますfile2.tmp" - [1]=> - string(45) "私はガラスを食べられますfile1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(1) "." - [1]=> - string(2) ".." - [2]=> - string(45) "私はガラスを食べられますfile1.tmp" - [3]=> - string(45) "私はガラスを食べられますfile2.tmp" -} diff --git a/ext/standard/tests/dir/scandir_variation9.phpt b/ext/standard/tests/dir/scandir_variation9.phpt deleted file mode 100644 index 56e5575e55904..0000000000000 --- a/ext/standard/tests/dir/scandir_variation9.phpt +++ /dev/null @@ -1,65 +0,0 @@ ---TEST-- -Test scandir() function : usage variations - different ints as $sorting_order arg ---FILE-- - ---CLEAN-- - ---EXPECT-- -*** Testing scandir() : usage variations *** -array(4) { - [0]=> - string(9) "file2.tmp" - [1]=> - string(9) "file1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(9) "file2.tmp" - [1]=> - string(9) "file1.tmp" - [2]=> - string(2) ".." - [3]=> - string(1) "." -} -array(4) { - [0]=> - string(1) "." - [1]=> - string(2) ".." - [2]=> - string(9) "file1.tmp" - [3]=> - string(9) "file2.tmp" -} From 437a0e14e3bda4d5a417d652346c9a95aebdbd9f Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Wed, 8 Apr 2026 14:23:10 +0200 Subject: [PATCH 2/2] Throw ValueError when a wrong flag value is provided to the second argument of `scandir()` --- UPGRADING | 2 ++ ext/standard/dir.c | 2 +- ext/standard/tests/dir/scandir_invalid_flag.phpt | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/UPGRADING b/UPGRADING index a97ad00061a27..69c2b829f4181 100644 --- a/UPGRADING +++ b/UPGRADING @@ -134,6 +134,8 @@ PHP 8.6 UPGRADE NOTES - Standard: . pathinfo() now raises a ValueError when an invalid $flag argument value is passed. + . scandir() now raises a ValueError when an invalid $sorting_order + argument value is passed. - Zip: . ZipArchive::extractTo now raises a TypeError for the diff --git a/ext/standard/dir.c b/ext/standard/dir.c index 487ddfe8fd56f..a7e080ce2abe2 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -591,7 +591,7 @@ PHP_FUNCTION(scandir) } else if (flags == PHP_SCANDIR_SORT_DESCENDING) { n = php_stream_scandir(dirn, &namelist, context, (void *) php_stream_dirent_alphasortr); } else { - zend_argument_value_error(2, "must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING and SCANDIR_SORT_NONE constants"); + zend_argument_value_error(2, "must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING, or SCANDIR_SORT_NONE constants"); RETURN_THROWS(); } diff --git a/ext/standard/tests/dir/scandir_invalid_flag.phpt b/ext/standard/tests/dir/scandir_invalid_flag.phpt index 1cde17c75d5bb..76838dc869b88 100644 --- a/ext/standard/tests/dir/scandir_invalid_flag.phpt +++ b/ext/standard/tests/dir/scandir_invalid_flag.phpt @@ -9,4 +9,4 @@ try { } ?> --EXPECT-- -scandir(): Argument #2 ($sorting_order) must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING and SCANDIR_SORT_NONE constants +scandir(): Argument #2 ($sorting_order) must be one of the SCANDIR_SORT_ASCENDING, SCANDIR_SORT_DESCENDING, or SCANDIR_SORT_NONE constants