On Sun, Aug 14, 2011 at 11:25:22AM +0000, Emmanuel Guyot wrote: > > The following bug has been logged online: > > Bug reference: 6162 > Logged by: Emmanuel Guyot > Email address: emmanuel.gu...@gmail.com > PostgreSQL version: 8.2.3 > Operating system: Windows 7 > Description: initdb : Windows username isn't escaped > Details: > > Initdb crashes when I use it with a windows username that has a quote inside > (e.g. : L'élixir) > > Here is the error reported : > initialisation des droits sur les objets internes... 2010-05-14 17:01:25.434 > FATAL: syntax error at or near "élixir" at character 44 > 2010-05-14 17:01:25.434 STATEMENT: UPDATE pg_class SET relacl = > E'{"=r/\\"L'élixir\\""}' WHERE relkind IN ('r', 'v', 'S') AND relacl IS > NULL; > > If I force the username as an option with the escaped value L\'élixir the > initdb works fine, but I can't start the server. So I can't find a > workaround. > > I've watched the newer sources of initdb and I can't see any change for this > bug.
I have fixed the problem with the attached, applied patch, which will appear in Postgres 9.3. The problem was that single-quotes in usernames were not properly escaped by initdb. Also, I have improved the pg_hba.conf documentation, and added an assert to catch future breakage. -- Bruce Momjian <br...@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + It's impossible for everything to be true. +
diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml new file mode 100644 index 679c40a..9771394 *** a/doc/src/sgml/client-auth.sgml --- b/doc/src/sgml/client-auth.sgml *************** *** 80,86 **** Records cannot be continued across lines. A record is made 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. 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 character, and just match a database, user, or host with that name. --- 80,86 ---- Records cannot be continued across lines. A record is made up of a number of fields which are separated by spaces and/or tabs. ! 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., <literal>all</> or <literal>replication</>) makes the word lose its special character, and just match a database, user, or host with that name. diff --git a/src/backend/parser/scansup.c b/src/backend/parser/scansup.c new file mode 100644 index 6101457..b8e2f71 *** a/src/backend/parser/scansup.c --- b/src/backend/parser/scansup.c *************** scanstr(const char *s) *** 56,61 **** --- 56,63 ---- * appear in pairs, so there should be another character. */ i++; + /* The bootstrap parser is not as smart, so check here. */ + Assert(s[i] == '\''); newStr[j] = s[i]; } else if (s[i] == '\\') diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c new file mode 100644 index 132ad0f..a53760a *** a/src/bin/initdb/initdb.c --- b/src/bin/initdb/initdb.c *************** bootstrap_template1(void) *** 1395,1401 **** bki_lines = replace_token(bki_lines, "FLOAT8PASSBYVAL", FLOAT8PASSBYVAL ? "true" : "false"); ! bki_lines = replace_token(bki_lines, "POSTGRES", username); bki_lines = replace_token(bki_lines, "ENCODING", encodingid); --- 1395,1401 ---- bki_lines = replace_token(bki_lines, "FLOAT8PASSBYVAL", FLOAT8PASSBYVAL ? "true" : "false"); ! bki_lines = replace_token(bki_lines, "POSTGRES", escape_quotes(username)); bki_lines = replace_token(bki_lines, "ENCODING", encodingid); *************** setup_privileges(void) *** 2043,2050 **** PG_CMD_OPEN; ! priv_lines = replace_token(privileges_setup, ! "$POSTGRES_SUPERUSERNAME", username); for (line = priv_lines; *line != NULL; line++) PG_CMD_PUTS(*line); --- 2043,2050 ---- PG_CMD_OPEN; ! priv_lines = replace_token(privileges_setup, "$POSTGRES_SUPERUSERNAME", ! escape_quotes(username)); for (line = priv_lines; *line != NULL; line++) PG_CMD_PUTS(*line); *************** main(int argc, char *argv[]) *** 3056,3062 **** canonicalize_path(pg_data); #ifdef WIN32 - /* * Before we execute another program, make sure that we are running with a * restricted token. If not, re-execute ourselves with one. --- 3056,3061 ----
-- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs