On Thu, Aug 18, 2016 at 6:12 PM, Heikki Linnakangas <[email protected]> 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers