diff options
author | George Peter Banyard <girgias@php.net> | 2021-03-15 15:30:58 +0000 |
---|---|---|
committer | George Peter Banyard <girgias@php.net> | 2021-03-17 00:58:01 +0000 |
commit | c465462e912eae73d1e0407f2d2cb815f40f1c13 (patch) | |
tree | 9abd9996e7f4d4e2128a57cf41158b86a3300796 /ext | |
parent | 32fb9b6fd17f6f5b965ac8b2fb69cbfda7603416 (diff) | |
download | php-git-c465462e912eae73d1e0407f2d2cb815f40f1c13.tar.gz |
Use standard PDO way for fetching integer attribute values
Diffstat (limited to 'ext')
-rw-r--r-- | ext/pdo_dblib/dblib_driver.c | 21 | ||||
-rw-r--r-- | ext/pdo_firebird/firebird_driver.c | 1 | ||||
-rw-r--r-- | ext/pdo_mysql/mysql_driver.c | 12 | ||||
-rw-r--r-- | ext/pdo_oci/oci_driver.c | 13 | ||||
-rw-r--r-- | ext/pdo_sqlite/sqlite_driver.c | 11 | ||||
-rw-r--r-- | ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt | 16 |
6 files changed, 61 insertions, 13 deletions
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index ae45da6beb..b65694c045 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -273,22 +273,35 @@ zend_string *dblib_handle_last_id(pdo_dbh_t *dbh, const zend_string *name) static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; + zend_long lval; switch(attr) { case PDO_ATTR_DEFAULT_STR_PARAM: - H->assume_national_character_set_strings = zval_get_long(val) == PDO_PARAM_STR_NATL ? 1 : 0; + if (!pdo_get_long_param(&lval, val)) { + return false; + } + H->assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL ? 1 : 0; return true; case PDO_ATTR_TIMEOUT: case PDO_DBLIB_ATTR_QUERY_TIMEOUT: - return SUCCEED == dbsettime(zval_get_long(val)); + if (!pdo_get_long_param(&lval, val)) { + return false; + } + return SUCCEED == dbsettime(lval); case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER: - H->stringify_uniqueidentifier = zval_get_long(val); + if (!pdo_get_long_param(&lval, val)) { + return false; + } + H->stringify_uniqueidentifier = lval; return true; case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS: H->skip_empty_rowsets = zval_is_true(val); return true; case PDO_DBLIB_ATTR_DATETIME_CONVERT: - H->datetime_convert = zval_get_long(val); + if (!pdo_get_long_param(&lval, val)) { + return false; + } + H->datetime_convert = lval; return true; default: return false; diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c index 338aa88ec9..4bc3ea42b6 100644 --- a/ext/pdo_firebird/firebird_driver.c +++ b/ext/pdo_firebird/firebird_driver.c @@ -824,6 +824,7 @@ static bool firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval * switch (attr) { case PDO_ATTR_AUTOCOMMIT: { + /* Don't use pdo_get_long_param() API as zval_get_long accepts more things */ bool bval = zval_get_long(val)? 1 : 0; /* ignore if the new value equals the old one */ diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c index 94fa2411d6..74a24be399 100644 --- a/ext/pdo_mysql/mysql_driver.c +++ b/ext/pdo_mysql/mysql_driver.c @@ -402,11 +402,13 @@ static inline int mysql_handle_autocommit(pdo_dbh_t *dbh) /* {{{ pdo_mysql_set_attribute */ static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) { - zend_long lval = zval_get_long(val); - bool bval = lval ? 1 : 0; + zend_long lval; + /* Don't use pdo_get_long_param() API as zval_get_long accepts more things */ + bool bval = zval_get_long(val) ? 1 : 0; PDO_DBG_ENTER("pdo_mysql_set_attribute"); PDO_DBG_INF_FMT("dbh=%p", dbh); PDO_DBG_INF_FMT("attr=%l", attr); + switch (attr) { case PDO_ATTR_AUTOCOMMIT: /* ignore if the new value equals the old one */ @@ -419,6 +421,9 @@ static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) PDO_DBG_RETURN(true); case PDO_ATTR_DEFAULT_STR_PARAM: + if (!pdo_get_long_param(&lval, val)) { + PDO_DBG_RETURN(false); + } ((pdo_mysql_db_handle *)dbh->driver_data)->assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL; PDO_DBG_RETURN(true); @@ -439,6 +444,9 @@ static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) #ifndef PDO_USE_MYSQLND case PDO_MYSQL_ATTR_MAX_BUFFER_SIZE: + if (!pdo_get_long_param(&lval, val)) { + PDO_DBG_RETURN(false); + } if (lval < 0) { /* TODO: Johannes, can we throw a warning here? */ ((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size = 1024*1024; diff --git a/ext/pdo_oci/oci_driver.c b/ext/pdo_oci/oci_driver.c index dd4a7bb171..524820b910 100644 --- a/ext/pdo_oci/oci_driver.c +++ b/ext/pdo_oci/oci_driver.c @@ -425,12 +425,16 @@ static bool oci_handle_rollback(pdo_dbh_t *dbh) /* {{{ */ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */ { - zend_long lval = zval_get_long(val); + zend_long lval; pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; switch (attr) { case PDO_ATTR_AUTOCOMMIT: { + if (pdo_get_long_param(&lval, val) == false) { + return false; + } + if (dbh->in_txn) { /* Assume they want to commit whatever is outstanding */ H->last_err = OCITransCommit(H->svc, H->err, 0); @@ -447,6 +451,10 @@ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) } case PDO_ATTR_PREFETCH: { + if (!pdo_get_long_param(&lval, val)) { + return false; + } + H->prefetch = pdo_oci_sanitize_prefetch(lval); return true; } @@ -537,6 +545,9 @@ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) case PDO_OCI_ATTR_CALL_TIMEOUT: { #if (OCI_MAJOR_VERSION >= 18) + if (!pdo_get_long_param(&lval, val)) { + return false; + } ub4 timeout = (ub4) lval; H->last_err = OCIAttrSet(H->svc, OCI_HTYPE_SVCCTX, diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c index 217833f6ad..b7c20b1eae 100644 --- a/ext/pdo_sqlite/sqlite_driver.c +++ b/ext/pdo_sqlite/sqlite_driver.c @@ -294,13 +294,20 @@ static int pdo_sqlite_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return static bool pdo_sqlite_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val) { pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data; + zend_long lval; switch (attr) { case PDO_ATTR_TIMEOUT: - sqlite3_busy_timeout(H->db, zval_get_long(val) * 1000); + if (!pdo_get_long_param(&lval, val)) { + return false; + } + sqlite3_busy_timeout(H->db, lval * 1000); return true; case PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES: - sqlite3_extended_result_codes(H->db, zval_get_long(val)); + if (!pdo_get_long_param(&lval, val)) { + return false; + } + sqlite3_extended_result_codes(H->db, lval); return true; } return false; diff --git a/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt b/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt index fc30f1d21c..dbb4b6cf7d 100644 --- a/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt +++ b/ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt @@ -9,14 +9,22 @@ if (!extension_loaded('pdo_sqlite')) die('skip PDO SQLite not available'); $pdo = new PDO("sqlite:".__DIR__."/foo.db"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); -var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, NULL)); +try { + var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, NULL)); +} catch (\TypeError $e) { + echo $e->getMessage(), \PHP_EOL; +} var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 1)); -var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 'nonsense')); +try { + var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 'nonsense')); +} catch (\TypeError $e) { + echo $e->getMessage(), \PHP_EOL; +} @unlink(__DIR__."/foo.db"); ?> --EXPECT-- +Attribute value must be of type int for selected attribute, null given bool(true) -bool(true) -bool(true) +Attribute value must be of type int for selected attribute, string given |