Commit 3afd6d3e756 for php.net

commit 3afd6d3e7569a54fb830f09f868ff914a35d1b14
Author: Weilin Du <108666168+LamentXU123@users.noreply.github.com>
Date:   Mon Apr 20 22:57:07 2026 +0800

    /ext/standard: Check for empty string in linkinfo() (#21793)

diff --git a/NEWS b/NEWS
index 8c2b185d328..481c4ea2c38 100644
--- a/NEWS
+++ b/NEWS
@@ -166,6 +166,8 @@ PHP                                                                        NEWS
     throw a ValueError. (alexandre-daubois)
   . array_change_key_case() now raises a ValueError when an invalid $case
     argument value is passed. (Girgias)
+  . linkinfo() now raises a ValueError when the argument is an empty string.
+    (Weilin Du)

 - Streams:
   . Added so_keepalive, tcp_keepidle, tcp_keepintvl and tcp_keepcnt stream
diff --git a/UPGRADING b/UPGRADING
index f7874c2d347..0e66a96909f 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -88,6 +88,7 @@ PHP 8.6 UPGRADE NOTES
     argument value is passed.
   . array_change_key_case() now raises a ValueError when an invalid $case
     argument value is passed.
+  . linkinfo() now raises a ValueError when the $path argument is empty.
   . pathinfo() now raises a ValueError when an invalid $flag
     argument value is passed.
   . scandir() now raises a ValueError when an invalid $sorting_order
diff --git a/ext/standard/link.c b/ext/standard/link.c
index d92e74bb674..dfd92a0a870 100644
--- a/ext/standard/link.c
+++ b/ext/standard/link.c
@@ -84,7 +84,11 @@ PHP_FUNCTION(linkinfo)
 		Z_PARAM_PATH(link, link_len)
 	ZEND_PARSE_PARAMETERS_END();

-	// TODO Check for empty string
+	if (UNEXPECTED(link_len == 0)) {
+		zend_argument_must_not_be_empty_error(1);
+		RETURN_THROWS();
+	}
+
 	dirname = estrndup(link, link_len);
 	zend_dirname(dirname, link_len);

diff --git a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt
index f4035f8f40a..c8420ea86fb 100644
--- a/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt
+++ b/ext/standard/tests/file/symlink_link_linkinfo_is_link_error1.phpt
@@ -27,8 +27,11 @@
 echo "\n*** Testing linkinfo() for error conditions ***\n";

 //invalid arguments
-var_dump( linkinfo('') );  // empty string as linkname
-var_dump( linkinfo(false) );  // boolean false as linkname
+try {
+    var_dump(linkinfo(''));  // empty string as linkname
+} catch (ValueError $e) {
+    echo $e->getMessage() . "\n";
+}

 echo "Done\n";
 ?>
@@ -53,10 +56,5 @@
 bool(false)

 *** Testing linkinfo() for error conditions ***
-
-Warning: linkinfo(): %s in %s on line %d
-int(-1)
-
-Warning: linkinfo(): %s in %s on line %d
-int(-1)
+linkinfo(): Argument #1 ($path) must not be empty
 Done