From f499376c208c453742fce9a3c5dcbfd191f612c0 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 27 Nov 2016 09:08:14 +0000 Subject: [PATCH] Wrapper function xstrdup checks for memory exhaustion --- src/common.c | 2 +- src/lexer.l | 12 ++++++------ src/lib.c | 5 ++--- src/make.c | 2 +- src/nvc.c | 6 +++--- src/object.c | 4 ++-- src/rt/cover.c | 2 +- src/util.c | 14 +++++++++++--- src/util.h | 1 + 9 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/common.c b/src/common.c index 4de925a2..6299de3d 100644 --- a/src/common.c +++ b/src/common.c @@ -319,7 +319,7 @@ bool parse_value(type_t type, const char *str, int64_t *value) case T_ENUM: { bool upcase = true; - char *copy = strdup(str), *p; + char *copy = xstrdup(str), *p; for (p = copy; (*p != '\0') && !isspace((int)*p); p++, str++) { if (*p == '\'') upcase = false; diff --git a/src/lexer.l b/src/lexer.l index 24407cff..afee6c51 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -319,7 +319,7 @@ CONTEXT ?i:context {STRING} { return parse_string(yytext); } {TICK} { TOKEN(tTICK); } {CHAR} { if (resolve_ir1045()) { - yylval.s = strdup(yytext); + yylval.s = xstrdup(yytext); TOKEN(tID); } REJECT; @@ -404,7 +404,7 @@ static int parse_decimal_literal (const char *str) { int tok = tERROR; /* Copy of input text */ - char *tmp = strdup(str); + char *tmp = xstrdup(str); /* Stripping '_' character */ strip_underscores(tmp); @@ -466,7 +466,7 @@ static int parse_based_literal (const char *str) { int tok = tERROR; /* Copy of input text */ - char *tmp = strdup(str); + char *tmp = xstrdup(str); /* Stripping '_' character */ strip_underscores(tmp); @@ -514,7 +514,7 @@ static int parse_based_literal (const char *str) if (e != 0) yylval.d *= pow((double) atoi(base), (double) e); - + tok = ((*eptr_integer == '\0') && (*eptr_rational == '\0')) ? tREAL : tERROR; } } @@ -539,7 +539,7 @@ static int parse_based_literal (const char *str) static int parse_string(const char *str) { /* Copy of input */ - char *s = (yylval.s = strdup(str)); + char *s = (yylval.s = xstrdup(str)); /* Replacing double '\"' character by single '\"' */ /* or double '%' character by single '%' */ @@ -568,7 +568,7 @@ static int parse_string(const char *str) static int parse_bit_string(const char *str) { /* Copy of input */ - char *p = (yylval.s = strdup(str)); + char *p = (yylval.s = xstrdup(str)); /* Stripping '_' character */ strip_underscores(p); diff --git a/src/lib.c b/src/lib.c index 6faa05f9..8294656c 100644 --- a/src/lib.c +++ b/src/lib.c @@ -95,7 +95,7 @@ static const char *standard_suffix(vhdl_standard_t std) static ident_t upcase_name(const char * name) { - char *name_copy = strdup(name); + char *name_copy LOCAL = xstrdup(name); char *last_slash = strrchr(name_copy, '/'); while ((last_slash != NULL) && (*(last_slash + 1) == '\0')) { @@ -112,7 +112,6 @@ static ident_t upcase_name(const char * name) *last_dot = '\0'; ident_t i = ident_new(name_up); - free(name_copy); return i; } @@ -306,7 +305,7 @@ lib_t lib_new(const char *name, const char *path) if (lib != NULL) return lib; - char *name_copy LOCAL = strdup(name); + char *name_copy LOCAL = xstrdup(name); char *sep = strrchr(name_copy, '/'); // Ignore trailing slashes diff --git a/src/make.c b/src/make.c index 3963ed21..8770301e 100644 --- a/src/make.c +++ b/src/make.c @@ -184,7 +184,7 @@ static char *make_elab_name(tree_t t) const char *suffix = strchr(istr(tree_ident(t)), '.'); assert(suffix != NULL); - char *name = strdup(suffix + 1); + char *name = xstrdup(suffix + 1); for (char *p = name; *p != '\0'; p++) { if (*p == '.') *p = '\0'; diff --git a/src/nvc.c b/src/nvc.c index b289f6dc..663c41c5 100644 --- a/src/nvc.c +++ b/src/nvc.c @@ -47,7 +47,7 @@ static int process_command(int argc, char **argv); static ident_t to_unit_name(const char *str) { - char *name = strdup(str); + char *name = xstrdup(str); for (char *p = name; *p; p++) *p = toupper((int)*p); @@ -59,7 +59,7 @@ static ident_t to_unit_name(const char *str) static unsigned parse_relax(const char *str) { - char *copy = strdup(str); + char *copy = xstrdup(str); assert(copy); unsigned mask = 0; @@ -213,7 +213,7 @@ static void elab_verbose(bool verbose, const char *fmt, ...) static void parse_generic(const char *str) { - char *copy LOCAL = strdup(str); + char *copy LOCAL = xstrdup(str); char *split = strchr(copy, '='); if (split == NULL || *(split + 1) == '\0' || *copy == '\0') diff --git a/src/object.c b/src/object.c index 0a6248c8..ce4ec19a 100644 --- a/src/object.c +++ b/src/object.c @@ -881,7 +881,7 @@ object_rd_ctx_t *object_read_recover(object_t *object, const char *fname) ctx->store_sz = 256; ctx->store = xcalloc(ctx->store_sz * sizeof(object_t *)); ctx->n_objects = 0; - ctx->db_fname = strdup(fname); + ctx->db_fname = xstrdup(fname); object_visit_ctx_t visit_ctx = { .count = 0, @@ -920,7 +920,7 @@ object_rd_ctx_t *object_read_begin(fbuf_t *f, const char *fname) ctx->store_sz = 256; ctx->store = xmalloc(ctx->store_sz * sizeof(object_t *)); ctx->n_objects = 0; - ctx->db_fname = strdup(fname); + ctx->db_fname = xstrdup(fname); return ctx; } diff --git a/src/rt/cover.c b/src/rt/cover.c index 7a7f297e..bb8f3f02 100644 --- a/src/rt/cover.c +++ b/src/rt/cover.c @@ -192,7 +192,7 @@ static void cover_append_line(cover_file_t *f, const char *buf) } cover_line_t *l = &(f->lines[(f->n_lines)++]); - l->text = strdup(buf); + l->text = xstrdup(buf); l->len = strlen(buf); l->hits = -1; l->hl = NULL; diff --git a/src/util.c b/src/util.c index f436d3a5..e7a71dc3 100644 --- a/src/util.c +++ b/src/util.c @@ -256,7 +256,7 @@ void *xmalloc(size_t size) { void *p = malloc(size); if (p == NULL) - abort(); + fatal("memory exhausted"); return p; } @@ -264,7 +264,7 @@ void *xcalloc(size_t size) { void *p = calloc(1, size); if (p == NULL) - abort(); + fatal("memory exhausted"); return p; } @@ -272,10 +272,18 @@ void *xrealloc(void *ptr, size_t size) { ptr = realloc(ptr, size); if (ptr == NULL) - abort(); + fatal("memory exhausted"); return ptr; } +char *xstrdup(const char *str) +{ + char *copy = strdup(str); + if (copy == NULL) + fatal("memory exhausted"); + return copy; +} + char *xvasprintf(const char *fmt, va_list ap) { char *strp = NULL; diff --git a/src/util.h b/src/util.h index e6e0a865..c38a6323 100644 --- a/src/util.h +++ b/src/util.h @@ -38,6 +38,7 @@ void *xmalloc(size_t size); void *xcalloc(size_t size); void *xrealloc(void *ptr, size_t size); +char *xstrdup(const char *str); char *xvasprintf(const char *fmt, va_list ap); char *xasprintf(const char *fmt, ...) -- 2.39.2