From 004ac7b780308dc899e565b887c7def0a6e100f2 Mon Sep 17 00:00:00 2001 From: Andrew Benson Date: Thu, 30 Jan 2020 17:47:00 +0000 Subject: [PATCH] Remove check for maximum symbol name length. PR fortran/87103 * expr.c (gfc_check_conformance): Check vsnprintf for truncation. * iresolve.c (gfc_get_string): Likewise. * symbol.c (gfc_new_symbol): Remove check for maximum symbol name length. Remove redundant 0 setting of new calloc()ed gfc_symbol. --- gcc/fortran/ChangeLog | 9 +++++++++ gcc/fortran/expr.c | 4 +++- gcc/fortran/iresolve.c | 5 ++++- gcc/fortran/symbol.c | 16 ---------------- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2b66fc7c885..b8f70e6140f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2020-01-30 Bernhard Reutner-Fischer + + PR fortran/87103 + * expr.c (gfc_check_conformance): Check vsnprintf for truncation. + * iresolve.c (gfc_get_string): Likewise. + * symbol.c (gfc_new_symbol): Remove check for maximum symbol + name length. Remove redundant 0 setting of new calloc()ed + gfc_symbol. + 2020-01-30 Paul Thomas   Jakub Jelinek diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index f1d21e6b3c6..a9698c3e3d2 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3495,8 +3495,10 @@ gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, . return true; va_start (argp, optype_msgid); - vsnprintf (buffer, 240, optype_msgid, argp); + d = vsnprintf (buffer, sizeof (buffer), optype_msgid, argp); va_end (argp); + if (d < 1 || d >= (int) sizeof (buffer)) /* Reject truncation. */ + gfc_internal_error ("optype_msgid overflow: %d", d); if (op1->rank != op2->rank) { diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index 2a4d2e6a719..a991c3a5ab4 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -61,9 +61,12 @@ gfc_get_string (const char *format, ...) } else { + int ret; va_start (ap, format); - vsnprintf (temp_name, sizeof (temp_name), format, ap); + ret = vsnprintf (temp_name, sizeof (temp_name), format, ap); va_end (ap); + if (ret < 1 || ret >= (int) sizeof (temp_name)) /* Reject truncation. */ + gfc_internal_error ("identifier overflow: %d", ret); temp_name[sizeof (temp_name) - 1] = 0; str = temp_name; } diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 47b716454f2..96c0fc1ef30 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -3132,25 +3132,9 @@ gfc_new_symbol (const char *name, gfc_namespace *ns) gfc_clear_ts (&p->ts); gfc_clear_attr (&p->attr); p->ns = ns; - p->declared_at = gfc_current_locus; - - if (strlen (name) > GFC_MAX_SYMBOL_LEN) - gfc_internal_error ("new_symbol(): Symbol name too long"); - p->name = gfc_get_string ("%s", name); - /* Make sure flags for symbol being C bound are clear initially. */ - p->attr.is_bind_c = 0; - p->attr.is_iso_c = 0; - - /* Clear the ptrs we may need. */ - p->common_block = NULL; - p->f2k_derived = NULL; - p->assoc = NULL; - p->dt_next = NULL; - p->fn_result_spec = 0; - return p; } -- 2.30.2