Fix set of issues with memory-allocation system calls in frontend code

Like the backend, the frontend has wrappers on top of malloc() and such
whose use is recommended.  Particularly, it is possible to do memory
allocation without issuing an error.  Some binaries missed the use of
those wrappers, so let's fix the gap for consistency.

This also fixes two latent bugs:
- In pg_dump/pg_dumpall when parsing an ACL item, on an out-of-memory
error for strdup(), the code considered the failure as a ACL parsing
problem instead of an actual OOM.
- In pg_waldump, an OOM when building the target directory string would
cause a crash.

Author: Daniel Gustafsson
Discussion: https://postgr.es/m/gY0y9xenfoBPc-Tufsr2Zg-MmkrJslm0Tw_CMg4p_j58-k_PXNC0klMdkKQkg61BkXC9_uWo-DcUzfxnHqpkpoR5jjVZrPHqKYikcHIiONhg=@yesql.se
This commit is contained in:
Michael Paquier 2019-05-04 16:32:19 +09:00
parent 34ff542a71
commit 84e4570da9
5 changed files with 14 additions and 15 deletions

View File

@ -1979,7 +1979,8 @@ GetPrivilegesToDelete(HANDLE hToken)
return NULL; return NULL;
} }
tokenPrivs = (PTOKEN_PRIVILEGES) malloc(length); tokenPrivs = (PTOKEN_PRIVILEGES) pg_malloc_extended(length,
MCXT_ALLOC_NO_OOM);
if (tokenPrivs == NULL) if (tokenPrivs == NULL)
{ {
write_stderr(_("%s: out of memory\n"), progname); write_stderr(_("%s: out of memory\n"), progname);

View File

@ -481,15 +481,13 @@ parseAclItem(const char *item, const char *type,
char *slpos; char *slpos;
char *pos; char *pos;
buf = strdup(item); buf = pg_strdup(item);
if (!buf)
return false;
/* user or group name is string up to = */ /* user or group name is string up to = */
eqpos = copyAclUserName(grantee, buf); eqpos = copyAclUserName(grantee, buf);
if (*eqpos != '=') if (*eqpos != '=')
{ {
free(buf); pg_free(buf);
return false; return false;
} }
@ -501,13 +499,13 @@ parseAclItem(const char *item, const char *type,
slpos = copyAclUserName(grantor, slpos); slpos = copyAclUserName(grantor, slpos);
if (*slpos != '\0') if (*slpos != '\0')
{ {
free(buf); pg_free(buf);
return false; return false;
} }
} }
else else
{ {
free(buf); pg_free(buf);
return false; return false;
} }
@ -617,7 +615,7 @@ do { \
appendPQExpBuffer(privs, "(%s)", subname); appendPQExpBuffer(privs, "(%s)", subname);
} }
free(buf); pg_free(buf);
return true; return true;
} }

View File

@ -170,7 +170,7 @@ handle_args(int argc, char *argv[])
switch (option) switch (option)
{ {
case 'f': case 'f':
filename = strdup(optarg); filename = pg_strdup(optarg);
break; break;
case 's': case 's':

View File

@ -247,7 +247,7 @@ identify_target_directory(XLogDumpPrivate *private, char *directory,
{ {
if (search_directory(directory, fname)) if (search_directory(directory, fname))
{ {
private->inpath = strdup(directory); private->inpath = pg_strdup(directory);
return; return;
} }
@ -255,7 +255,7 @@ identify_target_directory(XLogDumpPrivate *private, char *directory,
snprintf(fpath, MAXPGPATH, "%s/%s", directory, XLOGDIR); snprintf(fpath, MAXPGPATH, "%s/%s", directory, XLOGDIR);
if (search_directory(fpath, fname)) if (search_directory(fpath, fname))
{ {
private->inpath = strdup(fpath); private->inpath = pg_strdup(fpath);
return; return;
} }
} }
@ -266,13 +266,13 @@ identify_target_directory(XLogDumpPrivate *private, char *directory,
/* current directory */ /* current directory */
if (search_directory(".", fname)) if (search_directory(".", fname))
{ {
private->inpath = strdup("."); private->inpath = pg_strdup(".");
return; return;
} }
/* XLOGDIR */ /* XLOGDIR */
if (search_directory(XLOGDIR, fname)) if (search_directory(XLOGDIR, fname))
{ {
private->inpath = strdup(XLOGDIR); private->inpath = pg_strdup(XLOGDIR);
return; return;
} }
@ -283,7 +283,7 @@ identify_target_directory(XLogDumpPrivate *private, char *directory,
snprintf(fpath, MAXPGPATH, "%s/%s", datadir, XLOGDIR); snprintf(fpath, MAXPGPATH, "%s/%s", datadir, XLOGDIR);
if (search_directory(fpath, fname)) if (search_directory(fpath, fname))
{ {
private->inpath = strdup(fpath); private->inpath = pg_strdup(fpath);
return; return;
} }
} }

View File

@ -200,7 +200,7 @@ do_lo_import(const char *filename_arg, const char *comment_arg)
char *bufptr; char *bufptr;
size_t slen = strlen(comment_arg); size_t slen = strlen(comment_arg);
cmdbuf = malloc(slen * 2 + 256); cmdbuf = pg_malloc_extended(slen * 2 + 256, MCXT_ALLOC_NO_OOM);
if (!cmdbuf) if (!cmdbuf)
return fail_lo_xact("\\lo_import", own_transaction); return fail_lo_xact("\\lo_import", own_transaction);
sprintf(cmdbuf, "COMMENT ON LARGE OBJECT %u IS '", loid); sprintf(cmdbuf, "COMMENT ON LARGE OBJECT %u IS '", loid);