]> granicus.if.org Git - php/commitdiff
Use standard PDO way for fetching integer attribute values
authorGeorge Peter Banyard <girgias@php.net>
Mon, 15 Mar 2021 15:30:58 +0000 (15:30 +0000)
committerGeorge Peter Banyard <girgias@php.net>
Wed, 17 Mar 2021 00:58:01 +0000 (00:58 +0000)
ext/pdo_dblib/dblib_driver.c
ext/pdo_firebird/firebird_driver.c
ext/pdo_mysql/mysql_driver.c
ext/pdo_oci/oci_driver.c
ext/pdo_sqlite/sqlite_driver.c
ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt

index ae45da6beb4255d4a6943c3c10026f68872abad2..b65694c045f269106dc6b1174f028e60a632c1c4 100644 (file)
@@ -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;
index 338aa88ec95e8500ee6bc3aee2e217063c8af8d1..4bc3ea42b698ba6f3a28698b108a3c908c28fc03 100644 (file)
@@ -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 */
index 94fa2411d67a4d032336d2550df1014e0c700afe..74a24be3994695abb8d6db94c259f8bfc5460bf8 100644 (file)
@@ -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;
index dd4a7bb171318b545f3d702bcf2d894edcfc4bd8..524820b91069824fb16c087d61e88065068382e9 100644 (file)
@@ -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,
index 217833f6ad8cae00aec1abcf40052363bd9540c4..b7c20b1eae85695c23c09ac9dd9755217b405af0 100644 (file)
@@ -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;
index fc30f1d21cc239c88c6d38c8948a2279d349e7bb..dbb4b6cf7dda859fcd9733d40b02306bdd307847 100644 (file)
@@ -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