diff -durpN postgresql/src/bin/initdb/initdb.c postgresql.1/src/bin/initdb/initdb.c --- postgresql/src/bin/initdb/initdb.c 2013-01-02 09:19:03.855521804 +0100 +++ postgresql.1/src/bin/initdb/initdb.c 2013-01-02 11:26:10.008494149 +0100 @@ -354,6 +354,18 @@ pg_strdup(const char *s) return result; } +static char * +escape_quotes(const char *src) +{ + char *result = escape_single_quotes_ascii(src); + if (!result) + { + fprintf(stderr, _("%s: out of memory\n"), progname); + exit(1); + } + return result; +} + /* * make a copy of the array of lines, with token replaced by replacement * the first time it occurs on each line. @@ -2415,35 +2427,6 @@ check_ok(void) } } -/* - * Escape (by doubling) any single quotes or backslashes in given string - * - * Note: this is used to process both postgresql.conf entries and SQL - * string literals. Since postgresql.conf strings are defined to treat - * backslashes as escapes, we have to double backslashes here. Hence, - * when using this for a SQL string literal, use E'' syntax. - * - * We do not need to worry about encoding considerations because all - * valid backend encodings are ASCII-safe. - */ -static char * -escape_quotes(const char *src) -{ - int len = strlen(src), - i, - j; - char *result = pg_malloc(len * 2 + 1); - - for (i = 0, j = 0; i < len; i++) - { - if (SQL_STR_DOUBLE(src[i], true)) - result[j++] = src[i]; - result[j++] = src[i]; - } - result[j] = '\0'; - return result; -} - /* Hack to suppress a warning about %x from some versions of gcc */ static inline size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm * tm) diff -durpN postgresql/src/include/port.h postgresql.1/src/include/port.h --- postgresql/src/include/port.h 2013-01-02 09:19:03.902522322 +0100 +++ postgresql.1/src/include/port.h 2013-01-02 11:26:32.695654454 +0100 @@ -469,4 +469,7 @@ extern int pg_mkdir_p(char *path, int om void tarCreateHeader(char *h, const char *filename, const char *linktarget, size_t size, mode_t mode, uid_t uid, gid_t gid, time_t mtime); int tarChecksum(char *header); +/* port/quotes.c */ +extern char *escape_single_quotes_ascii(const char *src); + #endif /* PG_PORT_H */ diff -durpN postgresql/src/port/Makefile postgresql.1/src/port/Makefile --- postgresql/src/port/Makefile 2013-01-02 09:19:03.935522680 +0100 +++ postgresql.1/src/port/Makefile 2013-01-02 10:43:57.358410221 +0100 @@ -32,7 +32,7 @@ LIBS += $(PTHREAD_LIBS) OBJS = $(LIBOBJS) chklocale.o dirmod.o erand48.o exec.o fls.o inet_net_ntop.o \ noblock.o path.o pgcheckdir.o pg_crc.o pgmkdirp.o pgsleep.o \ - pgstrcasecmp.o qsort.o qsort_arg.o sprompt.o tar.o thread.o + pgstrcasecmp.o quotes.o qsort.o qsort_arg.o sprompt.o tar.o thread.o # foo_srv.o and foo.o are both built from foo.c, but only foo.o has -DFRONTEND OBJS_SRV = $(OBJS:%.o=%_srv.o) diff -durpN postgresql/src/port/quotes.c postgresql.1/src/port/quotes.c --- postgresql/src/port/quotes.c 1970-01-01 01:00:00.000000000 +0100 +++ postgresql.1/src/port/quotes.c 2013-01-02 11:25:46.616328180 +0100 @@ -0,0 +1,37 @@ +#include "c.h" + +/* + * Escape (by doubling) any single quotes or backslashes in given string + * + * Note: this is used to process both postgresql.conf entries and SQL + * string literals. Since postgresql.conf strings are defined to treat + * backslashes as escapes, we have to double backslashes here. Hence, + * when using this for a SQL string literal, use E'' syntax. + * + * We do not care about encoding considerations because this function + * is only used for parsing or creating configuration files. + * + * Returns a malloced() string that it's the responsibility of the caller + * to free. + */ +char * +escape_single_quotes_ascii(const char *src) +{ + int len = strlen(src), + i, + j; + char *result = malloc(len * 2 + 1); + + if (!result) + return NULL; + + for (i = 0, j = 0; i < len; i++) + { + if (SQL_STR_DOUBLE(src[i], true)) + result[j++] = src[i]; + result[j++] = src[i]; + } + result[j] = '\0'; + return result; +} +