aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Benson <abenson@carnegiescience.edu>2020-01-30 17:47:00 +0000
committerAndrew Benson <abenson@carnegiescience.edu>2020-01-30 17:47:00 +0000
commit004ac7b780308dc899e565b887c7def0a6e100f2 (patch)
tree0f596d4c0602487ec10d0079723d42db43904b66 /gcc
parent59e6d62be2c980adfc375702792afb141a1f1a1b (diff)
downloadgcc-004ac7b780308dc899e565b887c7def0a6e100f2.zip
gcc-004ac7b780308dc899e565b887c7def0a6e100f2.tar.gz
gcc-004ac7b780308dc899e565b887c7def0a6e100f2.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/expr.c4
-rw-r--r--gcc/fortran/iresolve.c5
-rw-r--r--gcc/fortran/symbol.c16
4 files changed, 16 insertions, 18 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 2b66fc7..b8f70e61 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,12 @@
+2020-01-30 Bernhard Reutner-Fischer <aldot@gcc.gnu.org>
+
+ 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  <pault@gcc.gnu.org>
Jakub Jelinek <jakub@redhat.com>
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index f1d21e6..a9698c3 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 2a4d2e6..a991c3a 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 47b7164..96c0fc1 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;
}