On Thu, Aug 18, 2016 at 6:12 PM, Heikki Linnakangas <hlinn...@iki.fi> wrote: > On 06/22/2016 04:41 AM, Michael Paquier wrote: >> make s >> OK, there is not much that we can do here then. What about the rest? >> Those seem like legit concerns to me. > > > There's also a realloc() and an strdup() call in refint.c. But looking at > refint.c, I wonder why it's using malloc()/free() in the first place, rather > than e.g. TopMemoryContext. The string construction code with sprintf() and > strlen() looks quite antiqued, too, StringInfo would make it more readable. > > Does refint.c actually have any value anymore? What if we just removed it > altogether? It's good to have some C triggers in contrib, to serve as > examples, and to have some regression test coverage for all that. But ISTM > that the 'autoinc' module covers the trigger API just as well.
I'd be in favor for nuking it instead of keeping this code as it overlaps with autoinc, I did not notice that. Even if that's an example, it is actually showing some bad code patters, which kills its own purpose. > The code in ps_status() runs before the elog machinery has been initialized, > so you get a rather unhelpful error: > >> error occurred at ps_status.c:167 before error message processing is >> available > > I guess that's still better than outright crashing, though. There are also a > few strdup() calls there that can run out of memory.. Right. Another possibility is to directly call write_stderr to be sure that the user gets the right message, then do exit(1). Thinking more about it, as save_ps_display_args is called really at the beginning this is perhaps what makes the most sense, so I changed the patch this way. > Not many of the callers of simple_prompt() check for a NULL result, so in > all probability, returning NULL from there will just crash in the caller. > There's one existing "return NULL" in there already, so this isn't a new > problem, but can we find a better way? I got inspired by the return value in the case of WIN32. Letting sprompt.c in charge of printing an error does not seem like a good idea to me, and there are already callers of simple_prompt() that check for NULL and report an error appropriately, like pg_backup_db.c. So I think that we had better adapt all the existing calls of simple_prompt checking for NULL and make things more consistent by having the callers report errors. Hence I updated the patch with those changes. Another possibility would be to keep a static buffer that has a fixed size, basically 4096 as this is the maximum expected by psql, but that's a waste of bytes in all other cases: one caller uses 4096, two 128 and the rest use 100 or less. By the way, while looking at that, I also noticed that in exec_command of psql's command.c we don't check for gets_fromFile that could return NULL. > There are more malloc(), realloc() and strdup() calls in isolationtester and > pg_regress, that we ought to change too while we're at it. Right. I added some handling for those callers as well with the pg_ equivalents. -- Michael
diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c index e5eeec2..5dd0046 100644 --- a/contrib/oid2name/oid2name.c +++ b/contrib/oid2name/oid2name.c @@ -306,6 +306,11 @@ sql_conn(struct options * my_opts) { PQfinish(conn); password = simple_prompt("Password: ", 100, false); + if (!password) + { + fprintf(stderr, "%s: out of memory\n", "oid2name"); + exit(1); + } new_pass = true; } } while (new_pass); diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c index 769c805..30b9ed2 100644 --- a/contrib/vacuumlo/vacuumlo.c +++ b/contrib/vacuumlo/vacuumlo.c @@ -71,7 +71,14 @@ vacuumlo(const char *database, const struct _param * param) /* Note: password can be carried over from a previous call */ if (param->pg_prompt == TRI_YES && password == NULL) + { password = simple_prompt("Password: ", 100, false); + if (!password) + { + fprintf(stderr, "out of memory\n"); + return -1; + } + } /* * Start the connection. Loop until we have a password if requested by @@ -115,6 +122,11 @@ vacuumlo(const char *database, const struct _param * param) { PQfinish(conn); password = simple_prompt("Password: ", 100, false); + if (!password) + { + fprintf(stderr, "out of memory\n"); + return -1; + } new_pass = true; } } while (new_pass); diff --git a/src/backend/port/dynloader/darwin.c b/src/backend/port/dynloader/darwin.c index ccd92c3..a83c614 100644 --- a/src/backend/port/dynloader/darwin.c +++ b/src/backend/port/dynloader/darwin.c @@ -78,6 +78,9 @@ pg_dlsym(void *handle, char *funcname) NSSymbol symbol; char *symname = (char *) malloc(strlen(funcname) + 2); + if (!symname) + return NULL; + sprintf(symname, "_%s", funcname); if (NSIsSymbolNameDefined(symname)) { diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c index 892a810..09ef2df 100644 --- a/src/backend/utils/misc/ps_status.c +++ b/src/backend/utils/misc/ps_status.c @@ -109,6 +109,9 @@ static char **save_argv; * If needed, we make a copy of the original argv[] array to preserve it * from being clobbered by subsequent ps_display actions. * + * Note that in case of failure this cannot call elog() as it is not + * initialized yet. + * * (The original argv[] will not be overwritten by this routine, but may be * overwritten during init_ps_display. Also, the physical location of the * environment strings may be moved, so this should be called before any code @@ -163,8 +166,21 @@ save_ps_display_args(int argc, char **argv) * move the environment out of the way */ new_environ = (char **) malloc((i + 1) * sizeof(char *)); + if (!new_environ) + { + write_stderr("out of memory\n"); + exit(1); + } for (i = 0; environ[i] != NULL; i++) + { new_environ[i] = strdup(environ[i]); + + if (!new_environ[i]) + { + write_stderr("out of memory\n"); + exit(1); + } + } new_environ[i] = NULL; environ = new_environ; } @@ -189,8 +205,21 @@ save_ps_display_args(int argc, char **argv) int i; new_argv = (char **) malloc((argc + 1) * sizeof(char *)); + if (!new_argv) + { + write_stderr("out of memory\n"); + exit(1); + } for (i = 0; i < argc; i++) + { new_argv[i] = strdup(argv[i]); + + if (!new_argv[i]) + { + write_stderr("out of memory\n"); + exit(1); + } + } new_argv[argc] = NULL; #if defined(__darwin__) diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index a978bbc..18a2c3e 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -1569,6 +1569,11 @@ get_set_pwd(FILE *cmdfd) */ pwd1 = simple_prompt("Enter new superuser password: ", 100, false); pwd2 = simple_prompt("Enter it again: ", 100, false); + if (!pwd1 || !pwd2) + { + fprintf(stderr, _("out of memory\n")); + exit_nicely(); + } if (strcmp(pwd1, pwd2) != 0) { fprintf(stderr, _("Passwords didn't match.\n")); diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index 72d8657..b0ac16b 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -151,6 +151,12 @@ GetConnection(void) if (dbpassword) free(dbpassword); dbpassword = simple_prompt(_("Password: "), 100, false); + if (!dbpassword) + { + fprintf(stderr, _("%s: out of memory\n"), + progname); + exit(1); + } need_password = false; } diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 54a9f48..5e4a9be 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -1890,7 +1890,14 @@ connectDatabase(const char *dbname, const char *connection_string, PQconninfoOption *conn_opts = NULL; if (prompt_password == TRI_YES && !password) + { password = simple_prompt("Password: ", 100, false); + if (password == NULL) + { + fprintf(stderr, "%s: out of memory\n", progname); + exit_nicely(1); + } + } /* * Start the connection. Loop until we have a password if requested by @@ -2003,6 +2010,11 @@ connectDatabase(const char *dbname, const char *connection_string, { PQfinish(conn); password = simple_prompt("Password: ", 100, false); + if (password == NULL) + { + fprintf(stderr, "%s: out of memory\n", progname); + exit_nicely(1); + } new_pass = true; } } while (new_pass); diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 87fb006..9af88b0 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -819,6 +819,11 @@ doConnect(void) { PQfinish(conn); password = simple_prompt("Password: ", 100, false); + if (!password) + { + fprintf(stderr, "out of memory\n"); + return NULL; + } new_pass = true; } } while (new_pass); diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 4aaf657..6fee807 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -1095,6 +1095,12 @@ exec_command(const char *cmd, pw1 = simple_prompt("Enter new password: ", 100, false); pw2 = simple_prompt("Enter it again: ", 100, false); + if (!pw1 || !pw2) + { + psql_error("out of memory\n"); + exit(EXIT_FAILURE); + } + if (strcmp(pw1, pw2) != 0) { psql_error("Passwords didn't match.\n"); @@ -1184,6 +1190,12 @@ exec_command(const char *cmd, result = gets_fromFile(stdin); } + if (!result) + { + psql_error("out of memory\n"); + exit(EXIT_FAILURE); + } + if (!SetVariable(pset.vars, opt, result)) { psql_error("\\%s: error while setting variable\n", cmd); @@ -1760,6 +1772,11 @@ prompt_for_password(const char *username) free(prompt_text); } + if (!result) + { + psql_error("out of memory\n"); + exit(EXIT_FAILURE); + } return result; } diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index 111593c..09cac30 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -210,7 +210,14 @@ main(int argc, char *argv[]) options.username); if (pset.getPassword == TRI_YES) + { password = simple_prompt(password_prompt, 100, false); + if (!password) + { + fprintf(stderr, _("%s: out of memory\n"), pset.progname); + exit(EXIT_FAILURE); + } + } /* loop until we have a password if requested by backend */ do @@ -249,6 +256,11 @@ main(int argc, char *argv[]) { PQfinish(pset.db); password = simple_prompt(password_prompt, 100, false); + if (!password) + { + fprintf(stderr, _("%s: out of memory\n"), pset.progname); + exit(EXIT_FAILURE); + } new_pass = true; } } while (new_pass); diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c index 7c1ebe0..16bef1a 100644 --- a/src/bin/scripts/common.c +++ b/src/bin/scripts/common.c @@ -79,7 +79,14 @@ connectDatabase(const char *dbname, const char *pghost, const char *pgport, } if (password == NULL && prompt_password == TRI_YES) + { password = simple_prompt("Password: ", 100, false); + if (!password) + { + fprintf(stderr, _("%s: out of memory\n"), progname); + exit(1); + } + } /* * Start the connection. Loop until we have a password if requested by @@ -126,6 +133,11 @@ connectDatabase(const char *dbname, const char *pghost, const char *pgport, if (password) free(password); password = simple_prompt("Password: ", 100, false); + if (!password) + { + fprintf(stderr, _("%s: out of memory\n"), progname); + exit(1); + } new_pass = true; } } while (new_pass); @@ -278,6 +290,11 @@ yesno_prompt(const char *question) char *resp; resp = simple_prompt(prompt, 1, true); + if (!resp) + { + fprintf(stderr, _("out of memory\n")); + exit(1); + } if (strcmp(resp, _(PG_YESLETTER)) == 0) { diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c index e88879d..6a80ecc 100644 --- a/src/bin/scripts/createuser.c +++ b/src/bin/scripts/createuser.c @@ -188,7 +188,14 @@ main(int argc, char *argv[]) if (newuser == NULL) { if (interactive) + { newuser = simple_prompt("Enter name of role to add: ", 128, true); + if (!newuser) + { + fprintf(stderr, _("%s: out of memory\n"), progname); + exit(1); + } + } else { if (getenv("PGUSER")) @@ -205,6 +212,11 @@ main(int argc, char *argv[]) pw1 = simple_prompt("Enter password for new role: ", 100, false); pw2 = simple_prompt("Enter it again: ", 100, false); + if (!pw1 || !pw2) + { + fprintf(stderr, _("%s: out of memory\n"), progname); + exit(1); + } if (strcmp(pw1, pw2) != 0) { fprintf(stderr, _("Passwords didn't match.\n")); diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c index 31fa28f..94d5272 100644 --- a/src/bin/scripts/dropuser.c +++ b/src/bin/scripts/dropuser.c @@ -108,7 +108,14 @@ main(int argc, char *argv[]) if (dropuser == NULL) { if (interactive) + { dropuser = simple_prompt("Enter name of role to drop: ", 128, true); + if (!dropuser) + { + fprintf(stderr, _("%s: out of memory\n"), progname); + exit(1); + } + } else { fprintf(stderr, _("%s: missing required argument role name\n"), progname); diff --git a/src/port/sprompt.c b/src/port/sprompt.c index fd6f16e..da07c73 100644 --- a/src/port/sprompt.c +++ b/src/port/sprompt.c @@ -119,6 +119,11 @@ simple_prompt(const char *prompt, int maxlen, bool echo) { /* get a new handle to turn echo off */ t_orig = (LPDWORD) malloc(sizeof(DWORD)); + if (!t_orig) + { + free(destination); + return NULL; + } t = GetStdHandle(STD_INPUT_HANDLE); /* save the old configuration first */ diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c index 908a7ce..6452a1e 100644 --- a/src/test/isolation/isolationtester.c +++ b/src/test/isolation/isolationtester.c @@ -15,6 +15,7 @@ #include <sys/select.h> #endif +#include "common/fe_memutils.h" #include "datatype/timestamp.h" #include "libpq-fe.h" #include "pqexpbuffer.h" @@ -119,7 +120,7 @@ main(int argc, char **argv) for (i = 0; i < testspec->nsessions; i++) nallsteps += testspec->sessions[i]->nsteps; - allsteps = malloc(nallsteps * sizeof(Step *)); + allsteps = pg_malloc(nallsteps * sizeof(Step *)); n = 0; for (i = 0; i < testspec->nsessions; i++) @@ -190,7 +191,7 @@ main(int argc, char **argv) if (PQresultStatus(res) == PGRES_TUPLES_OK) { if (PQntuples(res) == 1 && PQnfields(res) == 1) - backend_pids[i] = strdup(PQgetvalue(res, 0, 0)); + backend_pids[i] = pg_strdup(PQgetvalue(res, 0, 0)); else { fprintf(stderr, "backend pid query returned %d rows and %d columns, expected 1 row and 1 column", @@ -286,7 +287,7 @@ run_all_permutations(TestSpec *testspec) for (i = 0; i < testspec->nsessions; i++) nsteps += testspec->sessions[i]->nsteps; - steps = malloc(sizeof(Step *) * nsteps); + steps = pg_malloc(sizeof(Step *) * nsteps); /* * To generate the permutations, we conceptually put the steps of each @@ -297,7 +298,7 @@ run_all_permutations(TestSpec *testspec) * A pile is actually just an integer which tells how many steps we've * already picked from this pile. */ - piles = malloc(sizeof(int) * testspec->nsessions); + piles = pg_malloc(sizeof(int) * testspec->nsessions); for (i = 0; i < testspec->nsessions; i++) piles[i] = 0; @@ -345,7 +346,7 @@ run_named_permutations(TestSpec *testspec) Permutation *p = testspec->permutations[i]; Step **steps; - steps = malloc(p->nsteps * sizeof(Step *)); + steps = pg_malloc(p->nsteps * sizeof(Step *)); /* Find all the named steps using the lookup table */ for (j = 0; j < p->nsteps; j++) @@ -476,8 +477,8 @@ run_permutation(TestSpec *testspec, int nsteps, Step **steps) return; } - waiting = malloc(sizeof(Step *) * testspec->nsessions); - errorstep = malloc(sizeof(Step *) * testspec->nsessions); + waiting = pg_malloc(sizeof(Step *) * testspec->nsessions); + errorstep = pg_malloc(sizeof(Step *) * testspec->nsessions); printf("\nstarting permutation:"); for (i = 0; i < nsteps; i++) diff --git a/src/test/isolation/specparse.y b/src/test/isolation/specparse.y index fce6cc6..59744ce 100644 --- a/src/test/isolation/specparse.y +++ b/src/test/isolation/specparse.y @@ -73,8 +73,8 @@ setup_list: } | setup_list setup { - $$.elements = realloc($1.elements, - ($1.nelements + 1) * sizeof(void *)); + $$.elements = pg_realloc($1.elements, + ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } @@ -97,15 +97,15 @@ opt_teardown: session_list: session_list session { - $$.elements = realloc($1.elements, - ($1.nelements + 1) * sizeof(void *)); + $$.elements = pg_realloc($1.elements, + ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | session { $$.nelements = 1; - $$.elements = malloc(sizeof(void *)); + $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; @@ -113,7 +113,7 @@ session_list: session: SESSION string_literal opt_setup step_list opt_teardown { - $$ = malloc(sizeof(Session)); + $$ = pg_malloc(sizeof(Session)); $$->name = $2; $$->setupsql = $3; $$->steps = (Step **) $4.elements; @@ -125,15 +125,15 @@ session: step_list: step_list step { - $$.elements = realloc($1.elements, - ($1.nelements + 1) * sizeof(void *)); + $$.elements = pg_realloc($1.elements, + ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | step { $$.nelements = 1; - $$.elements = malloc(sizeof(void *)); + $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; @@ -142,7 +142,7 @@ step_list: step: STEP string_literal sqlblock { - $$ = malloc(sizeof(Step)); + $$ = pg_malloc(sizeof(Step)); $$->name = $2; $$->sql = $3; $$->errormsg = NULL; @@ -164,15 +164,15 @@ opt_permutation_list: permutation_list: permutation_list permutation { - $$.elements = realloc($1.elements, - ($1.nelements + 1) * sizeof(void *)); + $$.elements = pg_realloc($1.elements, + ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | permutation { $$.nelements = 1; - $$.elements = malloc(sizeof(void *)); + $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; @@ -181,7 +181,7 @@ permutation_list: permutation: PERMUTATION string_literal_list { - $$ = malloc(sizeof(Permutation)); + $$ = pg_malloc(sizeof(Permutation)); $$->stepnames = (char **) $2.elements; $$->nsteps = $2.nelements; } @@ -190,15 +190,15 @@ permutation: string_literal_list: string_literal_list string_literal { - $$.elements = realloc($1.elements, - ($1.nelements + 1) * sizeof(void *)); + $$.elements = pg_realloc($1.elements, + ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | string_literal { $$.nelements = 1; - $$.elements = malloc(sizeof(void *)); + $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l index 675bd21..6f081d5 100644 --- a/src/test/isolation/specscanner.l +++ b/src/test/isolation/specscanner.l @@ -56,7 +56,7 @@ teardown { return(TEARDOWN); } } <qstr>\" { litbuf[litbufpos] = '\0'; - yylval.str = strdup(litbuf); + yylval.str = pg_strdup(litbuf); BEGIN(INITIAL); return(string_literal); } @@ -72,7 +72,7 @@ teardown { return(TEARDOWN); } } <sql>{space}*"}" { litbuf[litbufpos] = '\0'; - yylval.str = strdup(litbuf); + yylval.str = pg_strdup(litbuf); BEGIN(INITIAL); return(sqlblock); } diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 574f5b8..9dafdaf 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -29,6 +29,7 @@ #include <sys/resource.h> #endif +#include "common/fe_memutils.h" #include "common/restricted_token.h" #include "common/username.h" #include "getopt_long.h" @@ -151,10 +152,10 @@ unlimit_core_size(void) void add_stringlist_item(_stringlist **listhead, const char *str) { - _stringlist *newentry = malloc(sizeof(_stringlist)); + _stringlist *newentry = pg_malloc(sizeof(_stringlist)); _stringlist *oldentry; - newentry->str = strdup(str); + newentry->str = pg_strdup(str); newentry->next = NULL; if (*listhead == NULL) *listhead = newentry; @@ -187,7 +188,7 @@ free_stringlist(_stringlist **listhead) static void split_to_stringlist(const char *s, const char *delim, _stringlist **listhead) { - char *sc = strdup(s); + char *sc = pg_strdup(s); char *token = strtok(sc, delim); while (token) @@ -327,7 +328,7 @@ signal_remove_temp(int signum) static const char * make_temp_sockdir(void) { - char *template = strdup("/tmp/pg_regress-XXXXXX"); + char *template = pg_strdup("/tmp/pg_regress-XXXXXX"); temp_sockdir = mkdtemp(template); if (temp_sockdir == NULL) @@ -441,7 +442,7 @@ replace_string(char *string, char *replace, char *replacement) while ((ptr = strstr(string, replace)) != NULL) { - char *dup = strdup(string); + char *dup = pg_strdup(string); strlcpy(string, dup, ptr - string + 1); strcat(string, replacement); @@ -661,11 +662,11 @@ load_resultmap(void) */ if (string_matches_pattern(host_platform, platform)) { - _resultmap *entry = malloc(sizeof(_resultmap)); + _resultmap *entry = pg_malloc(sizeof(_resultmap)); - entry->test = strdup(buf); - entry->type = strdup(file_type); - entry->resultfile = strdup(expected); + entry->test = pg_strdup(buf); + entry->type = pg_strdup(file_type); + entry->resultfile = pg_strdup(expected); entry->next = resultmap; resultmap = entry; } @@ -908,7 +909,7 @@ current_windows_user(const char **acct, const char **dom) progname, GetLastError()); exit(2); } - tokenuser = malloc(retlen); + tokenuser = pg_malloc(retlen); if (!GetTokenInformation(token, TokenUser, tokenuser, retlen, &retlen)) { fprintf(stderr, @@ -1460,7 +1461,7 @@ wait_for_tests(PID_TYPE * pids, int *statuses, char **names, int num_tests) int i; #ifdef WIN32 - PID_TYPE *active_pids = malloc(num_tests * sizeof(PID_TYPE)); + PID_TYPE *active_pids = pg_malloc(num_tests * sizeof(PID_TYPE)); memcpy(active_pids, pids, num_tests * sizeof(PID_TYPE)); #endif @@ -1848,7 +1849,7 @@ open_result_files(void) /* create the log file (copy of running status output) */ snprintf(file, sizeof(file), "%s/regression.out", outputdir); - logfilename = strdup(file); + logfilename = pg_strdup(file); logfile = fopen(logfilename, "w"); if (!logfile) { @@ -1859,7 +1860,7 @@ open_result_files(void) /* create the diffs file as empty */ snprintf(file, sizeof(file), "%s/regression.diffs", outputdir); - difffilename = strdup(file); + difffilename = pg_strdup(file); difffile = fopen(difffilename, "w"); if (!difffile) { @@ -2064,13 +2065,13 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc * before we add the specified one. */ free_stringlist(&dblist); - split_to_stringlist(strdup(optarg), ", ", &dblist); + split_to_stringlist(pg_strdup(optarg), ", ", &dblist); break; case 2: debug = true; break; case 3: - inputdir = strdup(optarg); + inputdir = pg_strdup(optarg); break; case 4: add_stringlist_item(&loadlanguage, optarg); @@ -2079,10 +2080,10 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc max_connections = atoi(optarg); break; case 6: - encoding = strdup(optarg); + encoding = pg_strdup(optarg); break; case 7: - outputdir = strdup(optarg); + outputdir = pg_strdup(optarg); break; case 8: add_stringlist_item(&schedulelist, optarg); @@ -2094,27 +2095,27 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc nolocale = true; break; case 13: - hostname = strdup(optarg); + hostname = pg_strdup(optarg); break; case 14: port = atoi(optarg); port_specified_by_user = true; break; case 15: - user = strdup(optarg); + user = pg_strdup(optarg); break; case 16: /* "--bindir=" means to use PATH */ if (strlen(optarg)) - bindir = strdup(optarg); + bindir = pg_strdup(optarg); else bindir = NULL; break; case 17: - dlpath = strdup(optarg); + dlpath = pg_strdup(optarg); break; case 18: - split_to_stringlist(strdup(optarg), ", ", &extraroles); + split_to_stringlist(pg_strdup(optarg), ", ", &extraroles); break; case 19: add_stringlist_item(&temp_configs, optarg); @@ -2123,13 +2124,13 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc use_existing = true; break; case 21: - launcher = strdup(optarg); + launcher = pg_strdup(optarg); break; case 22: add_stringlist_item(&loadextension, optarg); break; case 24: - config_auth_datadir = pstrdup(optarg); + config_auth_datadir = pg_strdup(optarg); break; default: /* getopt_long already emitted a complaint */
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers