Remove check for maximum symbol name length.
authorAndrew Benson <abenson@carnegiescience.edu>
Thu, 30 Jan 2020 17:47:00 +0000 (17:47 +0000)
committerAndrew Benson <abenson@carnegiescience.edu>
Thu, 30 Jan 2020 17:47:00 +0000 (17:47 +0000)
        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
gcc/fortran/expr.c
gcc/fortran/iresolve.c
gcc/fortran/symbol.c

index 2b66fc7c88543ae1d5d51214bb0d0b94820a91b5..b8f70e6140fb3ba1d171893775c9f13d65740ff0 100644 (file)
@@ -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>
 
index f1d21e6b3c6c3d1accd6195bb6a9948923982726..a9698c3e3d2ba2c34f428f66d1cbe6e4a19cca6d 100644 (file)
@@ -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)
     {
index 2a4d2e6a7199e22ce4c363831ddaaa5911fc9351..a991c3a5ab4a39bfc657d8da6fba3ecfcbf773c2 100644 (file)
@@ -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;
     }
index 47b716454f24320f806fb4577a193a554eaefdb7..96c0fc1ef30efd428163c270d78d128452b72482 100644 (file)
@@ -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;
 }