Index: src/bin/initdb/initdb.c =================================================================== RCS file: /cvsroot/pgsql-server/src/bin/initdb/initdb.c,v retrieving revision 1.56 diff -c -c -r1.56 initdb.c *** src/bin/initdb/initdb.c 6 Oct 2004 09:13:10 -0000 1.56 --- src/bin/initdb/initdb.c 7 Oct 2004 16:45:32 -0000 *************** *** 181,186 **** --- 181,187 ---- static void make_template0(void); static void trapsig(int signum); static void check_ok(void); + static void escape_locale(char **locale); static bool chklocale(const char *locale); static void setlocales(void); static void usage(const char *progname); *************** *** 1099,1114 **** snprintf(repltok, sizeof(repltok), "shared_buffers = %d", n_buffers); conflines = replace_token(conflines, "#shared_buffers = 1000", repltok); snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", lc_messages); conflines = replace_token(conflines, "#lc_messages = 'C'", repltok); snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'", lc_monetary); conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok); snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'", lc_numeric); - conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok); snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time); conflines = replace_token(conflines, "#lc_time = 'C'", repltok); --- 1100,1119 ---- snprintf(repltok, sizeof(repltok), "shared_buffers = %d", n_buffers); conflines = replace_token(conflines, "#shared_buffers = 1000", repltok); + + escape_locale(&lc_messages); snprintf(repltok, sizeof(repltok), "lc_messages = '%s'", lc_messages); conflines = replace_token(conflines, "#lc_messages = 'C'", repltok); + escape_locale(&lc_monetary); snprintf(repltok, sizeof(repltok), "lc_monetary = '%s'", lc_monetary); conflines = replace_token(conflines, "#lc_monetary = 'C'", repltok); + escape_locale(&lc_numeric); snprintf(repltok, sizeof(repltok), "lc_numeric = '%s'", lc_numeric); conflines = replace_token(conflines, "#lc_numeric = 'C'", repltok); + escape_locale(&lc_time); snprintf(repltok, sizeof(repltok), "lc_time = '%s'", lc_time); conflines = replace_token(conflines, "#lc_time = 'C'", repltok); *************** *** 1896,1906 **** } } /* * check if given string is a valid locale specifier - * based on some code given to me by Peter Eisentraut - * (but I take responsibility for it :-) */ static bool chklocale(const char *locale) --- 1901,1927 ---- } } + /* + * Escape any single quotes or backslashes in locale + */ + static void + escape_locale(char **locale) + { + int len = strlen(*locale), + i, j; + char *loc_temp = xmalloc(len * 2); + + for (i = 0, j = 0; i < len; i++) + { + if ((*locale)[i] == '\'' || (*locale)[i] == '\\') + loc_temp[j++] = '\\'; + loc_temp[j++] = (*locale)[i]; + } + *locale = loc_temp; + } /* * check if given string is a valid locale specifier */ static bool chklocale(const char *locale)