com php-src: FIX BUG #60512: ext/pdo_dblib/dblib_driver.c
| From: | Stanley Sufficool | Date: | Sat, 01 Jun 2013 06:58:16 +0000 |
| Subject: | com php-src: FIX BUG #60512: ext/pdo_dblib/dblib_driver.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-72271@lists.php.net to get a copy of this message | ||
Commit: 3b54de3db008490eeae8fba2e471a41906d1eae5
Author: Stanley Sufficool <ssufficool@php.net> Fri, 31 May 2013 23:58:16 -0700
Parents: 317653e694c8cd3a3cc4c12c527af584726a66c7
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=3b54de3db008490eeae8fba2e471a41906d1eae5
Log:
FIX BUG #60512
FreeTDS will segfault when passwords over 30 characters are used.
Truncate the password and let the server return an error if the
password is still invalid.
Bugs:
https://bugs.php.net/60512
Changed paths:
M ext/pdo_dblib/dblib_driver.c
Diff:
diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c
index 86c12bf..fb0d6d3 100644
--- a/ext/pdo_dblib/dblib_driver.c
+++ b/ext/pdo_dblib/dblib_driver.c
@@ -262,17 +262,19 @@ static struct pdo_dbh_methods dblib_methods = {
static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC)
{
pdo_dblib_db_handle *H;
- int i, ret = 0;
+ int i, nvars, ret = 0;
struct pdo_data_src_parser vars[] = {
- { "charset", NULL, 0 },
- { "appname", "PHP " PDO_DBLIB_FLAVOUR, 0 },
- { "host", "127.0.0.1", 0 },
- { "dbname", NULL, 0 },
- { "secure", NULL, 0 }, /* DBSETLSECURE */
- /* TODO: DBSETLVERSION ? */
+ { "charset", NULL, 0 }
+ ,{ "appname", "PHP " PDO_DBLIB_FLAVOUR, 0 }
+ ,{ "host", "127.0.0.1", 0 }
+ ,{ "dbname", NULL, 0 }
+ ,{ "secure", NULL, 0 } /* DBSETLSECURE */
+ /* TODO: DBSETLVERSION */
};
-
- php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, 5);
+
+ nvars = sizeof(vars)/sizeof(vars[0]);
+
+ php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, nvars);
H = pecalloc(1, sizeof(*H), dbh->is_persistent);
H->login = dblogin();
@@ -283,10 +285,20 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options
TSRMLS_
}
if (dbh->username) {
- DBSETLUSER(H->login, dbh->username);
+ if(FAIL == DBSETLUSER(H->login, dbh->username)) {
+ goto cleanup;
+ }
}
+
+ /*
+ * FreeTDS will not return FAIL but will segfault on passwords longer than 30 chars
+ */
+ if(strlen(dbh->password) > 30) dbh->password[30] = 0;
+
if (dbh->password) {
- DBSETLPWD(H->login, dbh->password);
+ if(FAIL == DBSETLPWD(H->login, dbh->password)) {
+ goto cleanup;
+ }
}
#if !PHP_DBLIB_IS_MSSQL
@@ -302,7 +314,7 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
H->link = dbopen(H->login, vars[2].optval);
- if (H->link == NULL) {
+ if (!H->link) {
goto cleanup;
}
@@ -324,7 +336,7 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
dbh->alloc_own_columns = 1;
cleanup:
- for (i = 0; i < sizeof(vars)/sizeof(vars[0]); i++) {
+ for (i = 0; i < nvars; i++) {
if (vars[i].freeme) {
efree(vars[i].optval);
}