1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Merge branch 'PHP-8.5'

* PHP-8.5:
  Fix GH-20601: ftp_connect() timeout argument overflow.
This commit is contained in:
David Carlier
2025-11-29 23:06:41 +00:00
3 changed files with 28 additions and 0 deletions

View File

@@ -147,11 +147,18 @@ PHP_FUNCTION(ftp_connect)
RETURN_THROWS();
}
const zend_long timeoutmax = (zend_long)((double) PHP_TIMEOUT_ULL_MAX / 1000000.0);
if (timeout_sec <= 0) {
zend_argument_value_error(3, "must be greater than 0");
RETURN_THROWS();
}
if (timeout_sec >= timeoutmax) {
zend_argument_value_error(3, "must be less than " ZEND_LONG_FMT, timeoutmax);
RETURN_THROWS();
}
/* connect */
if (!(ftp = ftp_open(host, (short)port, timeout_sec))) {
RETURN_FALSE;

View File

@@ -0,0 +1,19 @@
--TEST--
GH-20601 (ftp_connect timeout overflow)
--EXTENSIONS--
ftp
--SKIPIF--
<?php
if (PHP_INT_SIZE != 8) die("skip: 64-bit only");
if (PHP_OS_FAMILY === 'Windows') die("skip not for windows");
?>
--FILE--
<?php
try {
ftp_connect('127.0.0.1', 1024, PHP_INT_MAX);
} catch (\ValueError $e) {
echo $e->getMessage();
}
?>
--EXPECTF--
ftp_connect(): Argument #3 ($timeout) must be less than %d

View File

@@ -317,6 +317,8 @@ static inline void php_network_set_limit_time(struct timeval *limit_time,
struct timeval *timeout)
{
gettimeofday(limit_time, NULL);
const double timeoutmax = (double) PHP_TIMEOUT_ULL_MAX / 1000000.0;
ZEND_ASSERT(limit_time->tv_sec < (timeoutmax - timeout->tv_sec));
limit_time->tv_sec += timeout->tv_sec;
limit_time->tv_usec += timeout->tv_usec;
if (limit_time->tv_usec >= 1000000) {