summaryrefslogtreecommitdiff
path: root/ext/pdo_pgsql/pgsql_driver.c
diff options
context:
space:
mode:
authorMatteo Beccati <mbeccati@php.net>2015-06-12 00:27:31 +0200
committerMatteo Beccati <mbeccati@php.net>2015-06-12 00:27:31 +0200
commitcd5b7e968801ad2df0576cdc3273d2847590ad30 (patch)
treec2476789dd9eda896aff53f49f2c91816325ffc9 /ext/pdo_pgsql/pgsql_driver.c
parent9692e74b04eacf7a46f65df8db3eef34e695dba9 (diff)
parentafa4c3e7c72a616d21780fd39764f7fc03d0a3df (diff)
downloadphp-git-cd5b7e968801ad2df0576cdc3273d2847590ad30.tar.gz
Merge branch 'PHP-5.6'
* PHP-5.6: Fix bug #69362 (PDO-pgsql fails to connect if password contains a leading single quote) Fixed bug #61574 - No MSI Conflicts: ext/pdo_pgsql/pgsql_driver.c win32/install.txt
Diffstat (limited to 'ext/pdo_pgsql/pgsql_driver.c')
-rw-r--r--ext/pdo_pgsql/pgsql_driver.c59
1 files changed, 28 insertions, 31 deletions
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c
index 0a7ce6368d..f913eb7c31 100644
--- a/ext/pdo_pgsql/pgsql_driver.c
+++ b/ext/pdo_pgsql/pgsql_driver.c
@@ -27,6 +27,7 @@
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
+#include "ext/standard/php_string.h"
#include "main/php_network.h"
#include "pdo/php_pdo.h"
#include "pdo/php_pdo_driver.h"
@@ -62,6 +63,17 @@ static char * _pdo_pgsql_trim_message(const char *message, int persistent)
return tmp;
}
+static zend_string* _pdo_pgsql_escape_credentials(char *str)
+{
+ if (str) {
+ zend_string *tmp = zend_string_init(str, strlen(str), 0);
+
+ return php_addcslashes(tmp, 1, "\\'", sizeof("\\'"));
+ }
+
+ return NULL;
+}
+
int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *sqlstate, const char *msg, const char *file, int line) /* {{{ */
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
@@ -1179,7 +1191,7 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{
pdo_pgsql_db_handle *H;
int ret = 0;
char *conn_str, *p, *e;
- char *tmp_pass;
+ zend_string *tmp_user, *tmp_pass;
zend_long connect_timeout = 30;
H = pecalloc(1, sizeof(pdo_pgsql_db_handle), dbh->is_persistent);
@@ -1201,43 +1213,28 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{
connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30);
}
- if (dbh->password) {
- if (dbh->password[0] != '\'' && dbh->password[strlen(dbh->password) - 1] != '\'') {
- char *pwd = dbh->password;
- int pos = 1;
-
- tmp_pass = safe_emalloc(2, strlen(dbh->password), 3);
- tmp_pass[0] = '\'';
-
- while (*pwd != '\0') {
- if (*pwd == '\\' || *pwd == '\'') {
- tmp_pass[pos++] = '\\';
- }
-
- tmp_pass[pos++] = *pwd++;
- }
-
- tmp_pass[pos++] = '\'';
- tmp_pass[pos] = '\0';
- } else {
- tmp_pass = dbh->password;
- }
- }
+ /* escape username and password, if provided */
+ tmp_user = _pdo_pgsql_escape_credentials(dbh->username);
+ tmp_pass = _pdo_pgsql_escape_credentials(dbh->password);
/* support both full connection string & connection string + login and/or password */
- if (dbh->username && dbh->password) {
- spprintf(&conn_str, 0, "%s user=%s password=%s connect_timeout=%pd", dbh->data_source, dbh->username, tmp_pass, connect_timeout);
- } else if (dbh->username) {
- spprintf(&conn_str, 0, "%s user=%s connect_timeout=%pd", dbh->data_source, dbh->username, connect_timeout);
- } else if (dbh->password) {
- spprintf(&conn_str, 0, "%s password=%s connect_timeout=%pd", dbh->data_source, tmp_pass, connect_timeout);
+ if (tmp_user && tmp_pass) {
+ spprintf(&conn_str, 0, "%s user='%s' password='%s' connect_timeout=%pd", (char *) dbh->data_source, tmp_user->val, tmp_pass->val, connect_timeout);
+ } else if (tmp_user) {
+ spprintf(&conn_str, 0, "%s user='%s' connect_timeout=%pd", (char *) dbh->data_source, tmp_user->val, connect_timeout);
+ } else if (tmp_pass) {
+ spprintf(&conn_str, 0, "%s password='%s' connect_timeout=%pd", (char *) dbh->data_source, tmp_pass->val, connect_timeout);
} else {
spprintf(&conn_str, 0, "%s connect_timeout=%pd", (char *) dbh->data_source, connect_timeout);
}
H->server = PQconnectdb(conn_str);
- if (dbh->password && tmp_pass != dbh->password) {
- efree(tmp_pass);
+
+ if (tmp_user) {
+ zend_string_release(tmp_user);
+ }
+ if (tmp_pass) {
+ zend_string_release(tmp_pass);
}
efree(conn_str);