@@ -1039,6 +1039,7 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
1039
1039
pdo_pgsql_db_handle * H ;
1040
1040
int ret = 0 ;
1041
1041
char * conn_str , * p , * e ;
1042
+ char * tmp_pass ;
1042
1043
long connect_timeout = 30 ;
1043
1044
1044
1045
H = pecalloc (1 , sizeof (pdo_pgsql_db_handle ), dbh -> is_persistent );
@@ -1060,18 +1061,44 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
1060
1061
connect_timeout = pdo_attr_lval (driver_options , PDO_ATTR_TIMEOUT , 30 TSRMLS_CC );
1061
1062
}
1062
1063
1064
+ if (dbh -> password ) {
1065
+ if (dbh -> password [0 ] != '\'' && dbh -> password [strlen (dbh -> password ) - 1 ] != '\'' ) {
1066
+ char * pwd = dbh -> password ;
1067
+ int pos = 1 ;
1068
+
1069
+ tmp_pass = safe_emalloc (2 , strlen (dbh -> password ), 3 );
1070
+ tmp_pass [0 ] = '\'' ;
1071
+
1072
+ while (* pwd != '\0' ) {
1073
+ if (* pwd == '\\' || * pwd == '\'' ) {
1074
+ tmp_pass [pos ++ ] = '\\' ;
1075
+ }
1076
+
1077
+ tmp_pass [pos ++ ] = * pwd ++ ;
1078
+ }
1079
+
1080
+ tmp_pass [pos ++ ] = '\'' ;
1081
+ tmp_pass [pos ] = '\0' ;
1082
+ } else {
1083
+ tmp_pass = dbh -> password ;
1084
+ }
1085
+ }
1086
+
1063
1087
/* support both full connection string & connection string + login and/or password */
1064
1088
if (dbh -> username && dbh -> password ) {
1065
- spprintf (& conn_str , 0 , "%s user=%s password=%s connect_timeout=%ld" , dbh -> data_source , dbh -> username , dbh -> password , connect_timeout );
1089
+ spprintf (& conn_str , 0 , "%s user=%s password=%s connect_timeout=%ld" , dbh -> data_source , dbh -> username , tmp_pass , connect_timeout );
1066
1090
} else if (dbh -> username ) {
1067
1091
spprintf (& conn_str , 0 , "%s user=%s connect_timeout=%ld" , dbh -> data_source , dbh -> username , connect_timeout );
1068
1092
} else if (dbh -> password ) {
1069
- spprintf (& conn_str , 0 , "%s password=%s connect_timeout=%ld" , dbh -> data_source , dbh -> password , connect_timeout );
1093
+ spprintf (& conn_str , 0 , "%s password=%s connect_timeout=%ld" , dbh -> data_source , tmp_pass , connect_timeout );
1070
1094
} else {
1071
1095
spprintf (& conn_str , 0 , "%s connect_timeout=%ld" , (char * ) dbh -> data_source , connect_timeout );
1072
1096
}
1073
1097
1074
1098
H -> server = PQconnectdb (conn_str );
1099
+ if (dbh -> password && tmp_pass != dbh -> password ) {
1100
+ efree (tmp_pass );
1101
+ }
1075
1102
1076
1103
efree (conn_str );
1077
1104
0 commit comments