]> granicus.if.org Git - php/commitdiff
MFB: Fixed bug #44189 (PDO setAttribute() does not properly validate values
authorIlia Alshanetsky <iliaa@php.net>
Thu, 21 Feb 2008 13:38:12 +0000 (13:38 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 21 Feb 2008 13:38:12 +0000 (13:38 +0000)
for native numeric options)

ext/pdo/pdo_dbh.c

index 3efb53b1678b50d904e00b7edb3d81a761cd7424..9642b8324c76fcad15ee23e78092bf175cc55f09 100755 (executable)
@@ -675,8 +675,17 @@ static PHP_METHOD(PDO, rollBack)
 
 static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, long attr, zval *value TSRMLS_DC) /* {{{ */
 {
+
+#define PDO_LONG_PARAM_CHECK \
+       if (Z_TYPE_P(value) != IS_LONG && Z_TYPE_P(value) != IS_STRING && Z_TYPE_P(value) != IS_BOOL) { \
+               pdo_raise_impl_error(dbh, NULL, "HY000", "attribute value must be an integer" TSRMLS_CC); \
+               PDO_HANDLE_DBH_ERR(); \
+               return FAILURE; \
+       } \
+
        switch (attr) {
                case PDO_ATTR_ERRMODE:
+                       PDO_LONG_PARAM_CHECK;
                        convert_to_long(value);
                        switch (Z_LVAL_P(value)) {
                                case PDO_ERRMODE_SILENT:
@@ -692,6 +701,7 @@ static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, long attr, zval *value TSRMLS_D
                        return FAILURE;
 
                case PDO_ATTR_CASE:
+                       PDO_LONG_PARAM_CHECK;
                        convert_to_long(value);
                        switch (Z_LVAL_P(value)) {
                                case PDO_CASE_NATURAL:
@@ -707,6 +717,7 @@ static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, long attr, zval *value TSRMLS_D
                        return FAILURE;
 
                case PDO_ATTR_ORACLE_NULLS:
+                       PDO_LONG_PARAM_CHECK;
                        convert_to_long(value);
                        dbh->oracle_nulls = Z_LVAL_P(value);
                        return SUCCESS;
@@ -720,6 +731,8 @@ static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, long attr, zval *value TSRMLS_D
                                                return FAILURE;
                                        }
                                }
+                       } else {
+                               PDO_LONG_PARAM_CHECK;
                        }
 
                        convert_to_long(value);
@@ -731,6 +744,7 @@ static int pdo_dbh_attribute_set(pdo_dbh_t *dbh, long attr, zval *value TSRMLS_D
                        return SUCCESS;
 
                case PDO_ATTR_STRINGIFY_FETCHES:
+                       PDO_LONG_PARAM_CHECK;
                        convert_to_long(value);
                        dbh->stringify = Z_LVAL_P(value) ? 1 : 0;
                        return SUCCESS;