summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorGeorge Peter Banyard <girgias@php.net>2021-03-15 15:30:58 +0000
committerGeorge Peter Banyard <girgias@php.net>2021-03-17 00:58:01 +0000
commitc465462e912eae73d1e0407f2d2cb815f40f1c13 (patch)
tree9abd9996e7f4d4e2128a57cf41158b86a3300796 /ext
parent32fb9b6fd17f6f5b965ac8b2fb69cbfda7603416 (diff)
downloadphp-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.c21
-rw-r--r--ext/pdo_firebird/firebird_driver.c1
-rw-r--r--ext/pdo_mysql/mysql_driver.c12
-rw-r--r--ext/pdo_oci/oci_driver.c13
-rw-r--r--ext/pdo_sqlite/sqlite_driver.c11
-rw-r--r--ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt16
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