ext/posix posix_ttyname/posix_isatty fd error handling update.

Set to `EBADF` errno for posix_ttyname when out of ranges.
posix_fpathconf now returns false on out of range file descriptors.

close GH-17209
This commit is contained in:
David Carlier 2024-12-18 00:25:38 +00:00
parent 8aac6987c2
commit fb2443ac5c
No known key found for this signature in database
GPG key ID: 2FB76A8CE6CD2B41
6 changed files with 31 additions and 1 deletions

3
NEWS
View file

@ -54,6 +54,9 @@ PHP NEWS
- POSIX: - POSIX:
. Added POSIX_SC_OPEN_MAX constant to get the number of file descriptors . Added POSIX_SC_OPEN_MAX constant to get the number of file descriptors
a process can handle. (David Carlier) a process can handle. (David Carlier)
. posix_ttyname() sets last_error to EBADF on invalid file descriptors,
posix_isatty() raises E_WARNING on invalid file descriptors,
posix_fpathconf checks invalid file descriptors. (David Carlier)
- Random: - Random:
. Moves from /dev/urandom usage to arc4random_buf on Haiku. (David Carlier) . Moves from /dev/urandom usage to arc4random_buf on Haiku. (David Carlier)

View file

@ -115,6 +115,14 @@ PHP 8.5 UPGRADE NOTES
- PGSQL: - PGSQL:
. pg_copy_from also supports inputs as Iterable. . pg_copy_from also supports inputs as Iterable.
- POSIX:
. posix_ttyname sets last_error to EBADF when encountering
an invalid file descriptor.
. posix_isatty raises an E_WARNING message when encountering
an invalid file descriptor.
. posix_fpathconf checks invalid file descriptors and sets
last_error to EBADF and raises an E_WARNING message.
======================================== ========================================
6. New Functions 6. New Functions
======================================== ========================================

View file

@ -470,6 +470,7 @@ PHP_FUNCTION(posix_ttyname)
/* fd must fit in an int and be positive */ /* fd must fit in an int and be positive */
if (fd < 0 || fd > INT_MAX) { if (fd < 0 || fd > INT_MAX) {
php_error_docref(NULL, E_WARNING, "Argument #1 ($file_descriptor) must be between 0 and %d", INT_MAX); php_error_docref(NULL, E_WARNING, "Argument #1 ($file_descriptor) must be between 0 and %d", INT_MAX);
POSIX_G(last_error) = EBADF;
RETURN_FALSE; RETURN_FALSE;
} }
} }
@ -532,6 +533,7 @@ PHP_FUNCTION(posix_isatty)
/* A valid file descriptor must fit in an int and be positive */ /* A valid file descriptor must fit in an int and be positive */
if (fd < 0 || fd > INT_MAX) { if (fd < 0 || fd > INT_MAX) {
php_error_docref(NULL, E_WARNING, "Argument #1 ($file_descriptor) must be between 0 and %d", INT_MAX);
POSIX_G(last_error) = EBADF; POSIX_G(last_error) = EBADF;
RETURN_FALSE; RETURN_FALSE;
} }
@ -1325,6 +1327,12 @@ PHP_FUNCTION(posix_fpathconf)
RETURN_THROWS(); RETURN_THROWS();
} }
} }
/* fd must fit in an int and be positive */
if (fd < 0 || fd > INT_MAX) {
php_error_docref(NULL, E_WARNING, "Argument #1 ($file_descriptor) must be between 0 and %d", INT_MAX);
POSIX_G(last_error) = EBADF;
RETURN_FALSE;
}
ret = fpathconf(fd, name); ret = fpathconf(fd, name);

View file

@ -10,6 +10,7 @@ if (!function_exists("posix_pathconf")) die("skip only platforms with posix_path
<?php <?php
var_dump(posix_fpathconf(-1, POSIX_PC_PATH_MAX)); var_dump(posix_fpathconf(-1, POSIX_PC_PATH_MAX));
var_dump(posix_errno() != 0); var_dump(posix_errno() != 0);
var_dump(posix_strerror(posix_errno()));
try { try {
posix_fpathconf("string arg", POSIX_PC_PATH_MAX); posix_fpathconf("string arg", POSIX_PC_PATH_MAX);
} catch (\TypeError $e) { } catch (\TypeError $e) {
@ -20,7 +21,10 @@ var_dump(posix_fpathconf($fd, POSIX_PC_PATH_MAX));
fclose($fd); fclose($fd);
?> ?>
--EXPECTF-- --EXPECTF--
Warning: posix_fpathconf(): Argument #1 ($file_descriptor) must be between 0 and %d in %s on line %d
bool(false) bool(false)
bool(true) bool(true)
string(19) "Bad file descriptor"
posix_fpathconf(): Argument #1 ($file_descriptor) must be of type int|resource, string given posix_fpathconf(): Argument #1 ($file_descriptor) must be of type int|resource, string given
int(%d) int(%d)

View file

@ -20,10 +20,14 @@ foreach ($values as $value) {
var_dump(posix_strerror(posix_get_last_error())); var_dump(posix_strerror(posix_get_last_error()));
} }
?> ?>
--EXPECT-- --EXPECTF--
Warning: posix_isatty(): Argument #1 ($file_descriptor) must be between 0 and %d in %s on line %d
bool(false) bool(false)
string(19) "Bad file descriptor" string(19) "Bad file descriptor"
bool(false) bool(false)
string(19) "Bad file descriptor" string(19) "Bad file descriptor"
Warning: posix_isatty(): Argument #1 ($file_descriptor) must be between 0 and %d in %s on line %d
bool(false) bool(false)
string(19) "Bad file descriptor" string(19) "Bad file descriptor"

View file

@ -16,11 +16,14 @@ $values = [
foreach ($values as $value) { foreach ($values as $value) {
var_dump(posix_ttyname($value)); var_dump(posix_ttyname($value));
var_dump(posix_strerror(posix_get_last_error()));
} }
?> ?>
--EXPECTF-- --EXPECTF--
Warning: posix_ttyname(): Argument #1 ($file_descriptor) must be between 0 and %d in %s on line %d Warning: posix_ttyname(): Argument #1 ($file_descriptor) must be between 0 and %d in %s on line %d
bool(false) bool(false)
string(19) "Bad file descriptor"
Warning: posix_ttyname(): Argument #1 ($file_descriptor) must be between 0 and %d in %s on line %d Warning: posix_ttyname(): Argument #1 ($file_descriptor) must be between 0 and %d in %s on line %d
bool(false) bool(false)
string(19) "Bad file descriptor"