Skip to content

Commit c88e9f4

Browse files
authored
Merge pull request #3590 from edman80/fix-dbid-password-specchars
Fix dbid password special chars
2 parents 89cc19f + 154152c commit c88e9f4

File tree

2 files changed

+90
-5
lines changed

2 files changed

+90
-5
lines changed

db/db_id.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ static int parse_db_url(struct db_id* id, const str* url)
7878
ST_SLASH2, /* Second slash */
7979
ST_USER_HOST, /* Username or hostname */
8080
ST_PASS_PORT, /* Password or port part */
81+
ST_PASSWORD, /* Explicitly the password */
8182
ST_HOST, /* Hostname part */
8283
ST_HOST6, /* Hostname part IPv6 */
8384
ST_PORT, /* Port part */
@@ -175,11 +176,22 @@ static int parse_db_url(struct db_id* id, const str* url)
175176
begin = url->s + i + 1;
176177
break;
177178

178-
case '/':
179-
id->host = prev_token; prev_token = NULL;
180-
id->port = str2s(begin, url->s + i - begin, 0);
181-
st = ST_DB;
179+
case ':': // Explicitly mark we are now in the password state
180+
st = ST_PASSWORD;
181+
if (dupl_string(&prev_token, begin, url->s + i) < 0) goto err;
182182
begin = url->s + i + 1;
183+
break;
184+
}
185+
break;
186+
187+
case ST_PASSWORD:
188+
switch (url->s[i]) {
189+
case '@': // Only @ terminates password
190+
st = ST_HOST;
191+
id->username = prev_token; prev_token = NULL;
192+
if (dupl_string(&id->password, begin, url->s + i) < 0) goto err;
193+
begin = url->s + i + 1;
194+
break;
183195
}
184196
break;
185197

db/test/test_db.c

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,77 @@ static void test_db_url(void)
4848
ok((db->unix_socket == NULL), "parse_db_url: %d-unix_socket: '%s'", i, db->unix_socket);
4949
ok(!strcmp(db->database, "database"), "parse_db_url: %d-database: '%s'", i, db->database);
5050
ok(!strcmp(db->parameters, "parameters"), "parse_db_url: %d-parameters: '%s'", i, db->parameters);
51-
}
51+
52+
//Test a password with special characters.
53+
i = 2;
54+
55+
DB_PARSE("mysql://user:p/a,ss@host:6033/database?parameters");
56+
ok(!strcmp(db->scheme, "mysql"), "parse_db_url: %d-schema: '%s'", i, db->scheme);
57+
ok(!strcmp(db->username, "user"), "parse_db_url: %d-username: '%s'", i, db->username);
58+
ok(!strcmp(db->password, "p/a,ss"), "parse_db_url: %d-password: '%s'", i, db->password);
59+
ok(!strcmp(db->host, "host"), "parse_db_url: %d-host: '%s'", i, db->host);
60+
ok((db->port == 6033), "parse_db_url: %d-port: '%d'", i, db->port);
61+
ok((db->unix_socket == NULL), "parse_db_url: %d-unix_socket: '%s'", i, db->unix_socket);
62+
ok(!strcmp(db->database, "database"), "parse_db_url: %d-database: '%s'", i, db->database);
63+
ok(!strcmp(db->parameters, "parameters"), "parse_db_url: %d-parameters: '%s'", i, db->parameters);
64+
65+
i = 3;
66+
67+
DB_PARSE("mysql://user:pa/ss@host:6033/database?parameters");
68+
ok(!strcmp(db->scheme, "mysql"), "parse_db_url: %d-schema: '%s'", i, db->scheme);
69+
ok(!strcmp(db->username, "user"), "parse_db_url: %d-username: '%s'", i, db->username);
70+
ok(!strcmp(db->password, "pa/ss"), "parse_db_url: %d-password: '%s'", i, db->password);
71+
ok(!strcmp(db->host, "host"), "parse_db_url: %d-host: '%s'", i, db->host);
72+
ok((db->port == 6033), "parse_db_url: %d-port: '%d'", i, db->port);
73+
ok((db->unix_socket == NULL), "parse_db_url: %d-unix_socket: '%s'", i, db->unix_socket);
74+
ok(!strcmp(db->database, "database"), "parse_db_url: %d-database: '%s'", i, db->database);
75+
ok(!strcmp(db->parameters, "parameters"), "parse_db_url: %d-parameters: '%s'", i, db->parameters);
76+
77+
i = 4;
78+
79+
DB_PARSE("mysql://user@host:6033/database?parameters");
80+
ok(!strcmp(db->scheme, "mysql"), "parse_db_url: %d-schema: '%s'", i, db->scheme);
81+
ok(!strcmp(db->username, "user"), "parse_db_url: %d-username: '%s'", i, db->username);
82+
ok((db->password == NULL), "parse_db_url: %d-password: '%s'", i, db->password);
83+
ok(!strcmp(db->host, "host"), "parse_db_url: %d-host: '%s'", i, db->host);
84+
ok((db->port == 6033), "parse_db_url: %d-port: '%d'", i, db->port);
85+
ok((db->unix_socket == NULL), "parse_db_url: %d-unix_socket: '%s'", i, db->unix_socket);
86+
ok(!strcmp(db->database, "database"), "parse_db_url: %d-database: '%s'", i, db->database);
87+
ok(!strcmp(db->parameters, "parameters"), "parse_db_url: %d-parameters: '%s'", i, db->parameters);
88+
89+
i = 5;
90+
91+
DB_PARSE("mysql://user:p//a!,ss@host:6033/database?parameters");
92+
ok(!strcmp(db->scheme, "mysql"), "parse_db_url: %d-schema: '%s'", i, db->scheme);
93+
ok(!strcmp(db->username, "user"), "parse_db_url: %d-username: '%s'", i, db->username);
94+
ok(!strcmp(db->password, "p//a!,ss"), "parse_db_url: %d-password: '%s'", i, db->password);
95+
ok(!strcmp(db->host, "host"), "parse_db_url: %d-host: '%s'", i, db->host);
96+
ok((db->port == 6033), "parse_db_url: %d-port: '%d'", i, db->port);
97+
ok((db->unix_socket == NULL), "parse_db_url: %d-unix_socket: '%s'", i, db->unix_socket);
98+
ok(!strcmp(db->database, "database"), "parse_db_url: %d-database: '%s'", i, db->database);
99+
ok(!strcmp(db->parameters, "parameters"), "parse_db_url: %d-parameters: '%s'", i, db->parameters);
100+
101+
i = 6;
102+
103+
DB_PARSE("mysql://user:pa//ss@host:6033/database?parameters");
104+
ok(!strcmp(db->scheme, "mysql"), "parse_db_url: %d-schema: '%s'", i, db->scheme);
105+
ok(!strcmp(db->username, "user"), "parse_db_url: %d-username: '%s'", i, db->username);
106+
ok(!strcmp(db->password, "pa//ss"), "parse_db_url: %d-password: '%s'", i, db->password);
107+
ok(!strcmp(db->host, "host"), "parse_db_url: %d-host: '%s'", i, db->host);
108+
ok((db->port == 6033), "parse_db_url: %d-port: '%d'", i, db->port);
109+
ok((db->unix_socket == NULL), "parse_db_url: %d-unix_socket: '%s'", i, db->unix_socket);
110+
ok(!strcmp(db->database, "database"), "parse_db_url: %d-database: '%s'", i, db->database);
111+
ok(!strcmp(db->parameters, "parameters"), "parse_db_url: %d-parameters: '%s'", i, db->parameters);
112+
113+
i = 7;
114+
115+
DB_PARSE("mysql://user:@host:6033/database?parameters");
116+
ok(!strcmp(db->scheme, "mysql"), "parse_db_url: %d-schema: '%s'", i, db->scheme);
117+
ok(!strcmp(db->username, "user"), "parse_db_url: %d-username: '%s'", i, db->username);
118+
ok(!strcmp(db->password, ""), "parse_db_url: %d-password: '%s'", i, db->password);
119+
ok(!strcmp(db->host, "host"), "parse_db_url: %d-host: '%s'", i, db->host);
120+
ok((db->port == 6033), "parse_db_url: %d-port: '%d'", i, db->port);
121+
ok((db->unix_socket == NULL), "parse_db_url: %d-unix_socket: '%s'", i, db->unix_socket);
122+
ok(!strcmp(db->database, "database"), "parse_db_url: %d-database: '%s'", i, db->database);
123+
ok(!strcmp(db->parameters, "parameters"), "parse_db_url: %d-parameters: '%s'", i, db->parameters);
124+
}

0 commit comments

Comments
 (0)