Skip to content

Commit c465462

Browse files
committed
Use standard PDO way for fetching integer attribute values
1 parent 32fb9b6 commit c465462

File tree

6 files changed

+61
-13
lines changed

6 files changed

+61
-13
lines changed

ext/pdo_dblib/dblib_driver.c

+17-4
Original file line numberDiff line numberDiff line change
@@ -273,22 +273,35 @@ zend_string *dblib_handle_last_id(pdo_dbh_t *dbh, const zend_string *name)
273273
static bool dblib_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
274274
{
275275
pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data;
276+
zend_long lval;
276277

277278
switch(attr) {
278279
case PDO_ATTR_DEFAULT_STR_PARAM:
279-
H->assume_national_character_set_strings = zval_get_long(val) == PDO_PARAM_STR_NATL ? 1 : 0;
280+
if (!pdo_get_long_param(&lval, val)) {
281+
return false;
282+
}
283+
H->assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL ? 1 : 0;
280284
return true;
281285
case PDO_ATTR_TIMEOUT:
282286
case PDO_DBLIB_ATTR_QUERY_TIMEOUT:
283-
return SUCCEED == dbsettime(zval_get_long(val));
287+
if (!pdo_get_long_param(&lval, val)) {
288+
return false;
289+
}
290+
return SUCCEED == dbsettime(lval);
284291
case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER:
285-
H->stringify_uniqueidentifier = zval_get_long(val);
292+
if (!pdo_get_long_param(&lval, val)) {
293+
return false;
294+
}
295+
H->stringify_uniqueidentifier = lval;
286296
return true;
287297
case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS:
288298
H->skip_empty_rowsets = zval_is_true(val);
289299
return true;
290300
case PDO_DBLIB_ATTR_DATETIME_CONVERT:
291-
H->datetime_convert = zval_get_long(val);
301+
if (!pdo_get_long_param(&lval, val)) {
302+
return false;
303+
}
304+
H->datetime_convert = lval;
292305
return true;
293306
default:
294307
return false;

ext/pdo_firebird/firebird_driver.c

+1
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,7 @@ static bool firebird_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *
824824
switch (attr) {
825825
case PDO_ATTR_AUTOCOMMIT:
826826
{
827+
/* Don't use pdo_get_long_param() API as zval_get_long accepts more things */
827828
bool bval = zval_get_long(val)? 1 : 0;
828829

829830
/* ignore if the new value equals the old one */

ext/pdo_mysql/mysql_driver.c

+10-2
Original file line numberDiff line numberDiff line change
@@ -402,11 +402,13 @@ static inline int mysql_handle_autocommit(pdo_dbh_t *dbh)
402402
/* {{{ pdo_mysql_set_attribute */
403403
static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
404404
{
405-
zend_long lval = zval_get_long(val);
406-
bool bval = lval ? 1 : 0;
405+
zend_long lval;
406+
/* Don't use pdo_get_long_param() API as zval_get_long accepts more things */
407+
bool bval = zval_get_long(val) ? 1 : 0;
407408
PDO_DBG_ENTER("pdo_mysql_set_attribute");
408409
PDO_DBG_INF_FMT("dbh=%p", dbh);
409410
PDO_DBG_INF_FMT("attr=%l", attr);
411+
410412
switch (attr) {
411413
case PDO_ATTR_AUTOCOMMIT:
412414
/* 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)
419421
PDO_DBG_RETURN(true);
420422

421423
case PDO_ATTR_DEFAULT_STR_PARAM:
424+
if (!pdo_get_long_param(&lval, val)) {
425+
PDO_DBG_RETURN(false);
426+
}
422427
((pdo_mysql_db_handle *)dbh->driver_data)->assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL;
423428
PDO_DBG_RETURN(true);
424429

@@ -439,6 +444,9 @@ static bool pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
439444

440445
#ifndef PDO_USE_MYSQLND
441446
case PDO_MYSQL_ATTR_MAX_BUFFER_SIZE:
447+
if (!pdo_get_long_param(&lval, val)) {
448+
PDO_DBG_RETURN(false);
449+
}
442450
if (lval < 0) {
443451
/* TODO: Johannes, can we throw a warning here? */
444452
((pdo_mysql_db_handle *)dbh->driver_data)->max_buffer_size = 1024*1024;

ext/pdo_oci/oci_driver.c

+12-1
Original file line numberDiff line numberDiff line change
@@ -425,12 +425,16 @@ static bool oci_handle_rollback(pdo_dbh_t *dbh) /* {{{ */
425425

426426
static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */
427427
{
428-
zend_long lval = zval_get_long(val);
428+
zend_long lval;
429429
pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
430430

431431
switch (attr) {
432432
case PDO_ATTR_AUTOCOMMIT:
433433
{
434+
if (pdo_get_long_param(&lval, val) == false) {
435+
return false;
436+
}
437+
434438
if (dbh->in_txn) {
435439
/* Assume they want to commit whatever is outstanding */
436440
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)
447451
}
448452
case PDO_ATTR_PREFETCH:
449453
{
454+
if (!pdo_get_long_param(&lval, val)) {
455+
return false;
456+
}
457+
450458
H->prefetch = pdo_oci_sanitize_prefetch(lval);
451459
return true;
452460
}
@@ -537,6 +545,9 @@ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
537545
case PDO_OCI_ATTR_CALL_TIMEOUT:
538546
{
539547
#if (OCI_MAJOR_VERSION >= 18)
548+
if (!pdo_get_long_param(&lval, val)) {
549+
return false;
550+
}
540551
ub4 timeout = (ub4) lval;
541552

542553
H->last_err = OCIAttrSet(H->svc, OCI_HTYPE_SVCCTX,

ext/pdo_sqlite/sqlite_driver.c

+9-2
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,20 @@ static int pdo_sqlite_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return
294294
static bool pdo_sqlite_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
295295
{
296296
pdo_sqlite_db_handle *H = (pdo_sqlite_db_handle *)dbh->driver_data;
297+
zend_long lval;
297298

298299
switch (attr) {
299300
case PDO_ATTR_TIMEOUT:
300-
sqlite3_busy_timeout(H->db, zval_get_long(val) * 1000);
301+
if (!pdo_get_long_param(&lval, val)) {
302+
return false;
303+
}
304+
sqlite3_busy_timeout(H->db, lval * 1000);
301305
return true;
302306
case PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES:
303-
sqlite3_extended_result_codes(H->db, zval_get_long(val));
307+
if (!pdo_get_long_param(&lval, val)) {
308+
return false;
309+
}
310+
sqlite3_extended_result_codes(H->db, lval);
304311
return true;
305312
}
306313
return false;

ext/pdo_sqlite/tests/bug_44159_sqlite_version.phpt

+12-4
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,22 @@ if (!extension_loaded('pdo_sqlite')) die('skip PDO SQLite not available');
99
$pdo = new PDO("sqlite:".__DIR__."/foo.db");
1010
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
1111

12-
var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, NULL));
12+
try {
13+
var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, NULL));
14+
} catch (\TypeError $e) {
15+
echo $e->getMessage(), \PHP_EOL;
16+
}
1317
var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 1));
14-
var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 'nonsense'));
18+
try {
19+
var_dump($pdo->setAttribute(PDO::NULL_TO_STRING, 'nonsense'));
20+
} catch (\TypeError $e) {
21+
echo $e->getMessage(), \PHP_EOL;
22+
}
1523

1624
@unlink(__DIR__."/foo.db");
1725

1826
?>
1927
--EXPECT--
28+
Attribute value must be of type int for selected attribute, null given
2029
bool(true)
21-
bool(true)
22-
bool(true)
30+
Attribute value must be of type int for selected attribute, string given

0 commit comments

Comments
 (0)