diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index 56938459bb33..9a4785924567 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -145,6 +145,11 @@ PHP_FUNCTION(ftp_connect) RETURN_THROWS(); } + if (port < 0 || port > 65535) { + zend_argument_value_error(2, "must be between 0 and 65535"); + RETURN_THROWS(); + } + if (timeout_sec <= 0) { zend_argument_value_error(3, "must be greater than 0"); RETURN_THROWS(); @@ -187,6 +192,11 @@ PHP_FUNCTION(ftp_ssl_connect) RETURN_THROWS(); } + if (port < 0 || port > 65535) { + zend_argument_value_error(2, "must be between 0 and 65535"); + RETURN_THROWS(); + } + if (timeout_sec <= 0) { zend_argument_value_error(3, "must be greater than 0"); RETURN_THROWS(); diff --git a/ext/ftp/tests/ftp_connect_port_range.phpt b/ext/ftp/tests/ftp_connect_port_range.phpt new file mode 100644 index 000000000000..4225c07cd00f --- /dev/null +++ b/ext/ftp/tests/ftp_connect_port_range.phpt @@ -0,0 +1,31 @@ +--TEST-- +ftp_connect(): $port values outside 0-65535 must throw ValueError, not alias onto a valid port +--EXTENSIONS-- +ftp +--FILE-- +getMessage(), "\n"; + } +} + +// Port 0 must be accepted (maps to default FTP port 21 in ftp_open) +// We expect false (connection refused), not ValueError. +$result = @ftp_connect('127.0.0.1', 0); +var_dump($result === false || is_object($result)); // true either way + +// Port 65535 must be accepted (last valid port). +$result = @ftp_connect('127.0.0.1', 65535); +var_dump($result === false || is_object($result)); // true either way +?> +--EXPECT-- +ftp_connect(): Argument #2 ($port) must be between 0 and 65535 +ftp_connect(): Argument #2 ($port) must be between 0 and 65535 +ftp_connect(): Argument #2 ($port) must be between 0 and 65535 +ftp_connect(): Argument #2 ($port) must be between 0 and 65535 +ftp_connect(): Argument #2 ($port) must be between 0 and 65535 +bool(true) +bool(true)