[fortran] Fix a segfault in io.c:compare_to_allowed_values

Kaz Kojima kkojima@rr.iij4u.or.jp
Mon Oct 16 13:32:00 GMT 2006


Hi,

There are some tests in gfortran.dg starting to fail for x86
cross sh4 compiler with the segmentation fault.
These errors can't be reproduced with the bootstrapped native
i686-pc-linux-gnu compiler but can be seen if fortran/io.c was
recompiled with -g.  The fault occurs at

0x080721b6 in compare_to_allowed_values (specifier=0x85b8a08 "STATUS",
    allowed=0x8672810, allowed_f2003=0x0, allowed_gnu=0x0,
    value=0x95d9760 "foo", statement=0x85b9bac "CLOSE", warn=1 '\001')
    at ../../ORIG/trunk/gcc/fortran/io.c:1279

1278      for (i = 0; allowed[i]; i++)
1279        if (len == strlen(allowed[i])
1280            && strncasecmp (value, allowed[i], strlen(allowed[i])) == 0)
1281          return 1;

where i is 2 and this compare_to_allowed_values is called at

#1  0x08072f83 in gfc_match_close () at ../../ORIG/trunk/gcc/fortran/io.c:1750
1750          if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,

and the 2nd argument 'status' is

1748          static const char * status[] = { "KEEP", "DELETE" };

which isn't terminated with a NULL pointer.  It looks all other
calls of compare_to_allowed_values use NULL terminated char *
arrays as its 2nd argument and the attached patch works for me.

Regards,
	kaz
--
	* io.c (gfc_match_close): Add NULL at the end of status.

--- ORIG/trunk/gcc/fortran/io.c	2006-10-15 12:14:10.000000000 +0900
+++ LOCAL/trunk/gcc/fortran/io.c	2006-10-15 18:16:39.000000000 +0900
@@ -1745,7 +1745,7 @@ gfc_match_close (void)
   /* Checks on the STATUS specifier.  */
   if (close->status && close->status->expr_type == EXPR_CONSTANT)
     {
-      static const char * status[] = { "KEEP", "DELETE" };
+      static const char * status[] = { "KEEP", "DELETE", NULL };
 
       if (!compare_to_allowed_values ("STATUS", status, NULL, NULL,
 				      close->status->value.character.string,



More information about the Fortran mailing list