diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c index 17d4d80fc9..a666731e72 100644 --- a/contrib/oid2name/oid2name.c +++ b/contrib/oid2name/oid2name.c @@ -51,6 +51,7 @@ struct options static void help(const char *progname); void get_opts(int, char **, struct options *); void *pg_malloc(size_t size); +void *pg_realloc(void *ptr, size_t size); char *pg_strdup(const char *str); void add_one_elt(char *eltname, eary *eary); char *get_comma_elts(eary *eary); @@ -203,16 +204,37 @@ help(const char *progname) void * pg_malloc(size_t size) { - void *ptr = malloc(size); + void *ptr; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; + ptr = malloc(size); if (!ptr) { - fprintf(stderr, "out of memory"); + fprintf(stderr, "out of memory\n"); exit(1); } return ptr; } +void * +pg_realloc(void *ptr, size_t size) +{ + void *result; + + /* Avoid unportable behavior of realloc(NULL, 0) */ + if (ptr == NULL && size == 0) + size = 1; + result = realloc(ptr, size); + if (!result) + { + fprintf(stderr, "out of memory\n"); + exit(1); + } + return result; +} + char * pg_strdup(const char *str) { @@ -220,7 +242,7 @@ pg_strdup(const char *str) if (!result) { - fprintf(stderr, "out of memory"); + fprintf(stderr, "out of memory\n"); exit(1); } return result; @@ -242,14 +264,8 @@ add_one_elt(char *eltname, eary *eary) else if (eary->num >= eary->alloc) { eary ->alloc *= 2; - eary ->array = (char **) - realloc(eary->array, eary->alloc * sizeof(char *)); - - if (!eary->array) - { - fprintf(stderr, "out of memory"); - exit(1); - } + eary ->array = (char **) pg_realloc(eary->array, + eary->alloc * sizeof(char *)); } eary ->array[eary->num] = pg_strdup(eltname); diff --git a/contrib/pg_upgrade/util.c b/contrib/pg_upgrade/util.c index d879e762fa..1d4bc89f0b 100644 --- a/contrib/pg_upgrade/util.c +++ b/contrib/pg_upgrade/util.c @@ -192,33 +192,39 @@ get_user_info(char **user_name) void * -pg_malloc(size_t n) +pg_malloc(size_t size) { - void *p = malloc(n); + void *p; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; + p = malloc(size); if (p == NULL) pg_log(PG_FATAL, "%s: out of memory\n", os_info.progname); - return p; } void * -pg_realloc(void *ptr, size_t n) +pg_realloc(void *ptr, size_t size) { - void *p = realloc(ptr, n); + void *p; + /* Avoid unportable behavior of realloc(NULL, 0) */ + if (ptr == NULL && size == 0) + size = 1; + p = realloc(ptr, size); if (p == NULL) pg_log(PG_FATAL, "%s: out of memory\n", os_info.progname); - return p; } void -pg_free(void *p) +pg_free(void *ptr) { - if (p != NULL) - free(p); + if (ptr != NULL) + free(ptr); } diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c index 509472262b..a669cf406b 100644 --- a/contrib/pgbench/pgbench.c +++ b/contrib/pgbench/pgbench.c @@ -299,6 +299,9 @@ pg_malloc(size_t size) { void *result; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; result = malloc(size); if (!result) { @@ -313,6 +316,9 @@ pg_realloc(void *ptr, size_t size) { void *result; + /* Avoid unportable behavior of realloc(NULL, 0) */ + if (ptr == NULL && size == 0) + size = 1; result = realloc(ptr, size); if (!result) { diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 48652b21ea..6b202e0425 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -3358,6 +3358,9 @@ guc_malloc(int elevel, size_t size) { void *data; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; data = malloc(size); if (data == NULL) ereport(elevel, @@ -3371,6 +3374,9 @@ guc_realloc(int elevel, void *old, size_t size) { void *data; + /* Avoid unportable behavior of realloc(NULL, 0) */ + if (old == NULL && size == 0) + size = 1; data = realloc(old, size); if (data == NULL) ereport(elevel, diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 11ff554d79..c56f721e08 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -294,6 +294,9 @@ pg_malloc(size_t size) { void *result; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; result = malloc(size); if (!result) { diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index b6cc2a303e..22f4128180 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -54,6 +54,9 @@ pg_malloc0(size_t size) { void *result; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; result = malloc(size); if (!result) { diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 6d74a154ab..23c47f6275 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -233,6 +233,9 @@ pg_malloc(size_t size) { void *result; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; result = malloc(size); if (!result) { diff --git a/src/bin/pg_dump/dumpmem.c b/src/bin/pg_dump/dumpmem.c index 22637e26e4..08e82b269d 100644 --- a/src/bin/pg_dump/dumpmem.c +++ b/src/bin/pg_dump/dumpmem.c @@ -42,6 +42,9 @@ pg_malloc(size_t size) { void *tmp; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; tmp = malloc(size); if (!tmp) exit_horribly(NULL, "out of memory\n"); @@ -63,6 +66,9 @@ pg_realloc(void *ptr, size_t size) { void *tmp; + /* Avoid unportable behavior of realloc(NULL, 0) */ + if (ptr == NULL && size == 0) + size = 1; tmp = realloc(ptr, size); if (!tmp) exit_horribly(NULL, "out of memory\n"); diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 1cb30088c4..179c162279 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -60,6 +60,9 @@ pg_malloc(size_t size) { void *tmp; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; tmp = malloc(size); if (!tmp) { diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c index 4a7d02f777..7d8875d81c 100644 --- a/src/bin/scripts/common.c +++ b/src/bin/scripts/common.c @@ -304,6 +304,9 @@ pg_malloc(size_t size) { void *tmp; + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; tmp = malloc(size); if (!tmp) { diff --git a/src/port/dirmod.c b/src/port/dirmod.c index 22f5c591b0..514424f82e 100644 --- a/src/port/dirmod.c +++ b/src/port/dirmod.c @@ -70,7 +70,11 @@ fe_palloc(Size size) { void *res; - if ((res = malloc(size)) == NULL) + /* Avoid unportable behavior of malloc(0) */ + if (size == 0) + size = 1; + res = malloc(size); + if (res == NULL) { fprintf(stderr, _("out of memory\n")); exit(1); @@ -96,7 +100,11 @@ fe_repalloc(void *pointer, Size size) { void *res; - if ((res = realloc(pointer, size)) == NULL) + /* Avoid unportable behavior of realloc(NULL, 0) */ + if (pointer == NULL && size == 0) + size = 1; + res = realloc(pointer, size); + if (res == NULL) { fprintf(stderr, _("out of memory\n")); exit(1);