@@ -1029,6 +1029,7 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
1029
1029
pdo_pgsql_db_handle * H ;
1030
1030
int ret = 0 ;
1031
1031
char * conn_str , * p , * e ;
1032
+ char * tmp_pass ;
1032
1033
long connect_timeout = 30 ;
1033
1034
1034
1035
H = pecalloc (1 , sizeof (pdo_pgsql_db_handle ), dbh -> is_persistent );
@@ -1050,18 +1051,44 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
1050
1051
connect_timeout = pdo_attr_lval (driver_options , PDO_ATTR_TIMEOUT , 30 TSRMLS_CC );
1051
1052
}
1052
1053
1054
+ if (dbh -> password ) {
1055
+ if (dbh -> password [0 ] != '\'' && dbh -> password [strlen (dbh -> password ) - 1 ] != '\'' ) {
1056
+ char * pwd = dbh -> password ;
1057
+ int pos = 1 ;
1058
+
1059
+ tmp_pass = safe_emalloc (2 , strlen (dbh -> password ), 3 );
1060
+ tmp_pass [0 ] = '\'' ;
1061
+
1062
+ while (* pwd != '\0' ) {
1063
+ if (* pwd == '\\' || * pwd == '\'' ) {
1064
+ tmp_pass [pos ++ ] = '\\' ;
1065
+ }
1066
+
1067
+ tmp_pass [pos ++ ] = * pwd ++ ;
1068
+ }
1069
+
1070
+ tmp_pass [pos ++ ] = '\'' ;
1071
+ tmp_pass [pos ] = '\0' ;
1072
+ } else {
1073
+ tmp_pass = dbh -> password ;
1074
+ }
1075
+ }
1076
+
1053
1077
/* support both full connection string & connection string + login and/or password */
1054
1078
if (dbh -> username && dbh -> password ) {
1055
- spprintf (& conn_str , 0 , "%s user=%s password=%s connect_timeout=%ld" , dbh -> data_source , dbh -> username , dbh -> password , connect_timeout );
1079
+ spprintf (& conn_str , 0 , "%s user=%s password=%s connect_timeout=%ld" , dbh -> data_source , dbh -> username , tmp_pass , connect_timeout );
1056
1080
} else if (dbh -> username ) {
1057
1081
spprintf (& conn_str , 0 , "%s user=%s connect_timeout=%ld" , dbh -> data_source , dbh -> username , connect_timeout );
1058
1082
} else if (dbh -> password ) {
1059
- spprintf (& conn_str , 0 , "%s password=%s connect_timeout=%ld" , dbh -> data_source , dbh -> password , connect_timeout );
1083
+ spprintf (& conn_str , 0 , "%s password=%s connect_timeout=%ld" , dbh -> data_source , tmp_pass , connect_timeout );
1060
1084
} else {
1061
1085
spprintf (& conn_str , 0 , "%s connect_timeout=%ld" , (char * ) dbh -> data_source , connect_timeout );
1062
1086
}
1063
1087
1064
1088
H -> server = PQconnectdb (conn_str );
1089
+ if (dbh -> password && tmp_pass != dbh -> password ) {
1090
+ efree (tmp_pass );
1091
+ }
1065
1092
1066
1093
efree (conn_str );
1067
1094
0 commit comments