From cbc8d65639344c390a1d1a7f646c186ff3ad8693 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 29 Jun 2015 12:42:52 -0400 Subject: Code + docs review for escaping of option values (commit 11a020eb6). Avoid memory leak from incorrect choice of how to free a StringInfo (resetStringInfo doesn't do it). Now that pg_split_opts doesn't scribble on the optstr, mark that as "const" for clarity. Attach the commentary in protocol.sgml to the right place, and add documentation about the user-visible effects of this change on postgres' -o option and libpq's PGOPTIONS option. --- src/backend/utils/init/postinit.c | 11 ++++++----- src/include/miscadmin.h | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 0e7b5fad2d..063b0653b4 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -418,7 +418,7 @@ InitCommunication(void) * backslashes, with \\ representing a literal backslash. */ void -pg_split_opts(char **argv, int *argcp, char *optstr) +pg_split_opts(char **argv, int *argcp, const char *optstr) { StringInfoData s; @@ -438,8 +438,8 @@ pg_split_opts(char **argv, int *argcp, char *optstr) break; /* - * Parse a single option + value, stopping at the first space, unless - * it's escaped. + * Parse a single option, stopping at the first space, unless it's + * escaped. */ while (*optstr) { @@ -457,10 +457,11 @@ pg_split_opts(char **argv, int *argcp, char *optstr) optstr++; } - /* now store the option */ + /* now store the option in the next argv[] position */ argv[(*argcp)++] = pstrdup(s.data); } - resetStringInfo(&s); + + pfree(s.data); } /* diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 71aa505e17..b539167360 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -408,7 +408,7 @@ extern AuxProcType MyAuxProcType; *****************************************************************************/ /* in utils/init/postinit.c */ -extern void pg_split_opts(char **argv, int *argcp, char *optstr); +extern void pg_split_opts(char **argv, int *argcp, const char *optstr); extern void InitializeMaxBackends(void); extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, char *out_dbname); -- cgit v1.2.3