Properly escape usernames in initdb, so names with single-quotes are

supported.  Also add assert to catch future breakage.

Also, improve documentation that "double"-quotes must be used in
pg_hba.conf (not single quotes).
This commit is contained in:
Bruce Momjian 2012-08-15 11:23:04 -04:00
parent eb919e8fde
commit a973296598
3 changed files with 6 additions and 5 deletions

View File

@ -80,7 +80,7 @@
Records cannot be continued across lines. Records cannot be continued across lines.
A record is made A record is made
up of a number of fields which are separated by spaces and/or tabs. up of a number of fields which are separated by spaces and/or tabs.
Fields can contain white space if the field value is quoted. Fields can contain white space if the field value is double-quoted.
Quoting one of the keywords in a database, user, or address field (e.g., Quoting one of the keywords in a database, user, or address field (e.g.,
<literal>all</> or <literal>replication</>) makes the word lose its special <literal>all</> or <literal>replication</>) makes the word lose its special
character, and just match a database, user, or host with that name. character, and just match a database, user, or host with that name.

View File

@ -56,6 +56,8 @@ scanstr(const char *s)
* appear in pairs, so there should be another character. * appear in pairs, so there should be another character.
*/ */
i++; i++;
/* The bootstrap parser is not as smart, so check here. */
Assert(s[i] == '\'');
newStr[j] = s[i]; newStr[j] = s[i];
} }
else if (s[i] == '\\') else if (s[i] == '\\')

View File

@ -1395,7 +1395,7 @@ bootstrap_template1(void)
bki_lines = replace_token(bki_lines, "FLOAT8PASSBYVAL", bki_lines = replace_token(bki_lines, "FLOAT8PASSBYVAL",
FLOAT8PASSBYVAL ? "true" : "false"); FLOAT8PASSBYVAL ? "true" : "false");
bki_lines = replace_token(bki_lines, "POSTGRES", username); bki_lines = replace_token(bki_lines, "POSTGRES", escape_quotes(username));
bki_lines = replace_token(bki_lines, "ENCODING", encodingid); bki_lines = replace_token(bki_lines, "ENCODING", encodingid);
@ -2043,8 +2043,8 @@ setup_privileges(void)
PG_CMD_OPEN; PG_CMD_OPEN;
priv_lines = replace_token(privileges_setup, priv_lines = replace_token(privileges_setup, "$POSTGRES_SUPERUSERNAME",
"$POSTGRES_SUPERUSERNAME", username); escape_quotes(username));
for (line = priv_lines; *line != NULL; line++) for (line = priv_lines; *line != NULL; line++)
PG_CMD_PUTS(*line); PG_CMD_PUTS(*line);
@ -3056,7 +3056,6 @@ main(int argc, char *argv[])
canonicalize_path(pg_data); canonicalize_path(pg_data);
#ifdef WIN32 #ifdef WIN32
/* /*
* Before we execute another program, make sure that we are running with a * Before we execute another program, make sure that we are running with a
* restricted token. If not, re-execute ourselves with one. * restricted token. If not, re-execute ourselves with one.