Promote warnings to exceptions in ext/ftp

Closes GH-6054
This commit is contained in:
Máté Kocsis 2020-08-30 23:53:00 +02:00
parent 4a84aca68f
commit 1410cd6b08
No known key found for this signature in database
GPG key ID: FD055E41728BF310
8 changed files with 132 additions and 94 deletions

View file

@ -65,7 +65,7 @@ function ftp_fget($ftp, $fp, string $remote_file, int $mode = FTP_BINARY, int $r
* @param resource $ftp
* @param resource $fp
*/
function ftp_nb_fget($ftp, $fp, string $remote_file, int $mode = FTP_BINARY, int $resumpos = 0): int|false {}
function ftp_nb_fget($ftp, $fp, string $remote_file, int $mode = FTP_BINARY, int $resumpos = 0): int {}
/** @param resource $ftp */
function ftp_pasv($ftp, bool $pasv): bool {}
@ -89,7 +89,7 @@ function ftp_fput($ftp, string $remote_file, $fp, int $mode = FTP_BINARY, int $s
* @param resource $ftp
* @param resource $fp
*/
function ftp_nb_fput($ftp, string $remote_file, $fp, int $mode = FTP_BINARY, int $startpos = 0): int|false {}
function ftp_nb_fput($ftp, string $remote_file, $fp, int $mode = FTP_BINARY, int $startpos = 0): int {}
/** @param resource $ftp */
function ftp_put($ftp, string $remote_file, string $local_file, int $mode = FTP_BINARY, int $startpos = 0): bool {}

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: 830fdf6caf2804d49739fc5112c7091c0f6eb4d4 */
* Stub hash: 7cf8b5776e7d2ad943683d1f1c43d44b85dea7a1 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_ftp_connect, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
@ -86,7 +86,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fget, 0, 3, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, resumepos, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nb_fget, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fget, 0, 3, IS_LONG, 0)
ZEND_ARG_INFO(0, ftp)
ZEND_ARG_INFO(0, fp)
ZEND_ARG_TYPE_INFO(0, remote_file, IS_STRING, 0)
@ -127,7 +127,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_fput, 0, 3, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, startpos, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ftp_nb_fput, 0, 3, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftp_nb_fput, 0, 3, IS_LONG, 0)
ZEND_ARG_INFO(0, ftp)
ZEND_ARG_TYPE_INFO(0, remote_file, IS_STRING, 0)
ZEND_ARG_INFO(0, fp)

View file

@ -104,12 +104,12 @@ PHP_MINFO_FUNCTION(ftp)
}
#define XTYPE(xtype, mode) { \
if (mode != FTPTYPE_ASCII && mode != FTPTYPE_IMAGE) { \
php_error_docref(NULL, E_WARNING, "Mode must be FTP_ASCII or FTP_BINARY"); \
RETURN_FALSE; \
} \
xtype = mode; \
}
if (mode != FTPTYPE_ASCII && mode != FTPTYPE_IMAGE) { \
zend_argument_value_error(4, "must be either FTP_ASCII or FTP_BINARY"); \
RETURN_THROWS(); \
} \
xtype = mode; \
}
/* {{{ Opens a FTP stream */
@ -126,8 +126,8 @@ PHP_FUNCTION(ftp_connect)
}
if (timeout_sec <= 0) {
php_error_docref(NULL, E_WARNING, "Timeout has to be greater than 0");
RETURN_FALSE;
zend_argument_value_error(3, "must be greater than 0");
RETURN_THROWS();
}
/* connect */
@ -162,8 +162,8 @@ PHP_FUNCTION(ftp_ssl_connect)
}
if (timeout_sec <= 0) {
php_error_docref(NULL, E_WARNING, "Timeout has to be greater than 0");
RETURN_FALSE;
zend_argument_value_error(3, "must be greater than 0");
RETURN_THROWS();
}
/* connect */
@ -825,7 +825,7 @@ PHP_FUNCTION(ftp_nb_continue)
}
if (!ftp->nb) {
php_error_docref(NULL, E_WARNING, "No nbronous transfer to continue.");
php_error_docref(NULL, E_WARNING, "No nbronous transfer to continue");
RETURN_LONG(PHP_FTP_FAILED);
}
@ -1257,38 +1257,35 @@ PHP_FUNCTION(ftp_set_option)
switch (option) {
case PHP_FTP_OPT_TIMEOUT_SEC:
if (Z_TYPE_P(z_value) != IS_LONG) {
php_error_docref(NULL, E_WARNING, "Option TIMEOUT_SEC expects value of type int, %s given",
zend_zval_type_name(z_value));
RETURN_FALSE;
zend_argument_type_error(3, "must be of type int for the FTP_TIMEOUT_SEC option, %s given", zend_zval_type_name(z_value));
RETURN_THROWS();
}
if (Z_LVAL_P(z_value) <= 0) {
php_error_docref(NULL, E_WARNING, "Timeout has to be greater than 0");
RETURN_FALSE;
zend_argument_value_error(3, "must be greater than 0 for the FTP_TIMEOUT_SEC option");
RETURN_THROWS();
}
ftp->timeout_sec = Z_LVAL_P(z_value);
RETURN_TRUE;
break;
case PHP_FTP_OPT_AUTOSEEK:
if (Z_TYPE_P(z_value) != IS_TRUE && Z_TYPE_P(z_value) != IS_FALSE) {
php_error_docref(NULL, E_WARNING, "Option AUTOSEEK expects value of type bool, %s given",
zend_zval_type_name(z_value));
RETURN_FALSE;
zend_argument_type_error(3, "must be of type bool for the FTP_AUTOSEEK option, %s given", zend_zval_type_name(z_value));
RETURN_THROWS();
}
ftp->autoseek = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
RETURN_TRUE;
break;
case PHP_FTP_OPT_USEPASVADDRESS:
if (Z_TYPE_P(z_value) != IS_TRUE && Z_TYPE_P(z_value) != IS_FALSE) {
php_error_docref(NULL, E_WARNING, "Option USEPASVADDRESS expects value of type bool, %s given",
zend_zval_type_name(z_value));
RETURN_FALSE;
zend_argument_type_error(3, "must be of type bool for the FTP_USEPASVADDRESS option, %s given", zend_zval_type_name(z_value));
RETURN_THROWS();
}
ftp->usepasvaddress = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
RETURN_TRUE;
break;
default:
php_error_docref(NULL, E_WARNING, "Unknown option '" ZEND_LONG_FMT "'", option);
RETURN_FALSE;
zend_argument_value_error(2, "must be either FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS");
RETURN_THROWS();
break;
}
}
@ -1320,9 +1317,8 @@ PHP_FUNCTION(ftp_get_option)
RETURN_BOOL(ftp->usepasvaddress);
break;
default:
php_error_docref(NULL, E_WARNING, "Unknown option '" ZEND_LONG_FMT "'", option);
RETURN_FALSE;
break;
zend_argument_value_error(2, "must be either FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS");
RETURN_THROWS();
}
}
/* }}} */

View file

@ -9,7 +9,11 @@ require 'skipif.inc';
require 'server.inc';
// Negative timeout
var_dump(ftp_connect('127.0.0.1', 0, -3));
try {
ftp_connect('127.0.0.1', 0, -3);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
$ftp = ftp_connect('127.0.0.1', $port);
if (!$ftp) die("Couldn't connect to the server");
@ -20,8 +24,7 @@ var_dump(ftp_login($ftp, 'user', 'bogus'));
var_dump(ftp_quit($ftp));
?>
--EXPECTF--
Warning: ftp_connect(): Timeout has to be greater than 0 in %s on line %d
bool(false)
ftp_connect(): Argument #3 ($timeout) must be greater than 0
bool(true)
Warning: ftp_login(): Not logged in. in %s on line %d

View file

@ -20,14 +20,40 @@ var_dump(ftp_chdir($ftp, '~'));
var_dump(ftp_chmod($ftp, 0666, 'x'));
var_dump(ftp_delete($ftp, 'x'));
var_dump(ftp_exec($ftp, 'x'));
var_dump(ftp_fget($ftp, STDOUT, 'x', 0));
var_dump(ftp_fput($ftp, 'x', fopen(__FILE__, 'r'), 0));
var_dump(ftp_get($ftp, 'x', 'y', 0));
try {
ftp_fget($ftp, STDOUT, 'x', 0);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
try {
ftp_fput($ftp, 'x', fopen(__FILE__, 'r'), 0);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
try {
ftp_get($ftp, 'x', 'y', 0);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
var_dump(ftp_mdtm($ftp, 'x'));
var_dump(ftp_mkdir($ftp, 'x'));
var_dump(ftp_nb_continue($ftp));
var_dump(ftp_nb_fget($ftp, STDOUT, 'x', 0));
var_dump(ftp_nb_fput($ftp, 'x', fopen(__FILE__, 'r'), 0));
try {
ftp_nb_fget($ftp, STDOUT, 'x', 0);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
try {
ftp_nb_fput($ftp, 'x', fopen(__FILE__, 'r'), 0);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
var_dump(ftp_systype($ftp));
var_dump(ftp_pwd($ftp));
var_dump(ftp_size($ftp, ''));
@ -38,49 +64,39 @@ var_dump(ftp_rmdir($ftp, ''));
bool(true)
bool(false)
Warning: ftp_cdup(): Command not implemented (1). in %s005.php on line 11
Warning: ftp_cdup(): Command not implemented (1). in %s005.php on line %d
bool(false)
Warning: ftp_chdir(): Command not implemented (2). in %s005.php on line 12
Warning: ftp_chdir(): Command not implemented (2). in %s005.php on line %d
bool(false)
Warning: ftp_chmod(): Command not implemented (3). in %s005.php on line 13
Warning: ftp_chmod(): Command not implemented (3). in %s005.php on line %d
bool(false)
Warning: ftp_delete(): Command not implemented (4). in %s005.php on line 14
Warning: ftp_delete(): Command not implemented (4). in %s005.php on line %d
bool(false)
Warning: ftp_exec(): Command not implemented (5). in %s005.php on line 15
bool(false)
Warning: ftp_fget(): Mode must be FTP_ASCII or FTP_BINARY in %s005.php on line 16
bool(false)
Warning: ftp_fput(): Mode must be FTP_ASCII or FTP_BINARY in %s005.php on line 17
bool(false)
Warning: ftp_get(): Mode must be FTP_ASCII or FTP_BINARY in %s005.php on line 18
Warning: ftp_exec(): Command not implemented (5). in %s005.php on line %d
bool(false)
ftp_fget(): Argument #4 ($mode) must be either FTP_ASCII or FTP_BINARY
ftp_fput(): Argument #4 ($mode) must be either FTP_ASCII or FTP_BINARY
ftp_get(): Argument #4 ($mode) must be either FTP_ASCII or FTP_BINARY
int(-1)
Warning: ftp_mkdir(): Command not implemented (7). in %s005.php on line 20
Warning: ftp_mkdir(): Command not implemented (7). in %s005.php on line %d
bool(false)
Warning: ftp_nb_continue(): No nbronous transfer to continue. in %s005.php on line 21
Warning: ftp_nb_continue(): No nbronous transfer to continue in %s005.php on line %d
int(0)
ftp_nb_fget(): Argument #4 ($mode) must be either FTP_ASCII or FTP_BINARY
ftp_nb_fput(): Argument #4 ($mode) must be either FTP_ASCII or FTP_BINARY
Warning: ftp_nb_fget(): Mode must be FTP_ASCII or FTP_BINARY in %s005.php on line 22
Warning: ftp_systype(): Command not implemented (8). in %s005.php on line %d
bool(false)
Warning: ftp_nb_fput(): Mode must be FTP_ASCII or FTP_BINARY in %s005.php on line 23
bool(false)
Warning: ftp_systype(): Command not implemented (8). in %s005.php on line 24
bool(false)
Warning: ftp_pwd(): Command not implemented (9). in %s005.php on line 25
Warning: ftp_pwd(): Command not implemented (9). in %s005.php on line %d
bool(false)
int(-1)
Warning: ftp_rmdir(): Command not implemented (11). in %s005.php on line 27
Warning: ftp_rmdir(): Command not implemented (11). in %s005.php on line %d
bool(false)

View file

@ -16,12 +16,16 @@ $ftp or die("Couldn't connect to the server");
var_dump(ftp_get_option($ftp, FTP_TIMEOUT_SEC));
var_dump(ftp_get_option($ftp, FTP_AUTOSEEK));
var_dump(ftp_get_option($ftp, FTP_USEPASVADDRESS));
var_dump(ftp_get_option($ftp, FOO_BAR));
try {
ftp_get_option($ftp, FOO_BAR);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
?>
--EXPECTF--
int(%d)
bool(true)
bool(true)
Warning: ftp_get_option(): Unknown option '10' in %s on line %d
bool(false)
ftp_get_option(): Argument #2 ($option) must be either FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS

View file

@ -13,24 +13,40 @@ $ftp = ftp_connect('127.0.0.1', $port);
ftp_login($ftp, 'user', 'pass');
$ftp or die("Couldn't connect to the server");
var_dump(ftp_set_option($ftp, FTP_TIMEOUT_SEC, 0));
var_dump(ftp_set_option($ftp, FTP_TIMEOUT_SEC, '0'));
var_dump(ftp_set_option($ftp, FTP_USEPASVADDRESS, ['1']));
var_dump(ftp_set_option($ftp, FTP_AUTOSEEK, 'true'));
var_dump(ftp_set_option($ftp, FOO_BAR, 1));
try {
ftp_set_option($ftp, FTP_TIMEOUT_SEC, 0);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
try {
ftp_set_option($ftp, FTP_TIMEOUT_SEC, '0');
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
try {
ftp_set_option($ftp, FTP_USEPASVADDRESS, ['1']);
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
try {
ftp_set_option($ftp, FTP_AUTOSEEK, 'true');
} catch (TypeError $exception) {
echo $exception->getMessage() . "\n";
}
try {
ftp_set_option($ftp, FOO_BAR, 1);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
?>
--EXPECTF--
Warning: ftp_set_option(): Timeout has to be greater than 0 in %s on line %d
bool(false)
Warning: ftp_set_option(): Option TIMEOUT_SEC expects value of type int, string given in %s on line %d
bool(false)
Warning: ftp_set_option(): Option USEPASVADDRESS expects value of type bool, array given in %s on line %d
bool(false)
Warning: ftp_set_option(): Option AUTOSEEK expects value of type bool, string given in %s on line %d
bool(false)
Warning: ftp_set_option(): Unknown option '10' in %s on line %d
bool(false)
--EXPECT--
ftp_set_option(): Argument #3 ($value) must be greater than 0 for the FTP_TIMEOUT_SEC option
ftp_set_option(): Argument #3 ($value) must be of type int for the FTP_TIMEOUT_SEC option, string given
ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_USEPASVADDRESS option, array given
ftp_set_option(): Argument #3 ($value) must be of type bool for the FTP_AUTOSEEK option, string given
ftp_set_option(): Argument #2 ($option) must be either FTP_TIMEOUT_SEC, FTP_AUTOSEEK, or FTP_USEPASVADDRESS

View file

@ -12,8 +12,12 @@ echo "*** Testing ftp_ssl_connect() function : error conditions ***\n";
echo "\n-- Testing ftp_ssl_connect() function on failure --\n";
var_dump(ftp_ssl_connect('totes.invalid'));
echo "\n-- Testing ftp_ssl_connect() function timeout warning for value 0 --\n";
ftp_ssl_connect('totes.invalid', 21, 0);
echo "\n-- Testing ftp_ssl_connect() function timeout exception for value 0 --\n";
try {
ftp_ssl_connect('totes.invalid', 21, 0);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}
echo "===DONE===\n";
--EXPECTF--
@ -24,7 +28,6 @@ echo "===DONE===\n";
Warning: ftp_ssl_connect(): php_network_getaddresses: getaddrinfo failed: %s in %s on line %d
bool(false)
-- Testing ftp_ssl_connect() function timeout warning for value 0 --
Warning: ftp_ssl_connect(): Timeout has to be greater than 0 in %s on line %d
-- Testing ftp_ssl_connect() function timeout exception for value 0 --
ftp_ssl_connect(): Argument #3 ($timeout) must be greater than 0
===DONE===