re PR bootstrap/12490 (buffer overflow in scan-decls.c)
authorTimo Kokkonen <tjko@iki.fi>
Wed, 8 Oct 2003 12:29:27 +0000 (15:29 +0300)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 8 Oct 2003 12:29:27 +0000 (12:29 +0000)
PR bootstrap/12490
* scan-decls.c (MAX_EXTERN_C_BRACES): New preprocessor constant
to define the size of the extern_C_braces array.  Set it to 200.
(scan_decls): Abort when extern_C_braces_length is out-of-bounds.

Co-Authored-By: Eric Botcazou <ebotcazou@libertysurf.fr>
From-SVN: r72224

gcc/ChangeLog
gcc/scan-decls.c

index 5b2e01a6f67607bc921fac70a8324202a5fb0d08..72fd7ae770bd3cf5c486f2e566164f66a768d16a 100644 (file)
@@ -1,3 +1,11 @@
+2003-10-08  Timo Kokkonen  <tjko@iki.fi>
+            Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR bootstrap/12490
+       * scan-decls.c (MAX_EXTERN_C_BRACES): New preprocessor constant
+       to define the size of the extern_C_braces array.  Set it to 200.
+       (scan_decls): Abort when extern_C_braces_length is out-of-bounds.
+
 2003-10-08  Carlo Wood  <carlo@alinoe.com>
 
        * Makefile.in (gengtype-lex.c): flex 2.5.4[a] doesn't understand
index 14f64e8cb2e175f9ca678a410ddaa16e09c38e5f..ebd69cb05c1152a9bfc2cb53c4778ef31b756ddf 100644 (file)
@@ -34,7 +34,9 @@ int brace_nesting = 0;
    indicate the (brace nesting levels of) left braces that were
    prefixed by extern "C".  */
 int extern_C_braces_length = 0;
-char extern_C_braces[20];
+/* 20 is not enough anymore on Solaris 9.  */
+#define MAX_EXTERN_C_BRACES  200
+char extern_C_braces[MAX_EXTERN_C_BRACES];
 #define in_extern_C_brace (extern_C_braces_length>0)
 
 /* True if the function declaration currently being scanned is
@@ -220,6 +222,12 @@ scan_decls (cpp_reader *pfile, int argc ATTRIBUTE_UNUSED,
                      brace_nesting++;
                      extern_C_braces[extern_C_braces_length++]
                        = brace_nesting;
+                     if (extern_C_braces_length >= MAX_EXTERN_C_BRACES)
+                       {
+                         fprintf (stderr,
+                                  "Internal error: out-of-bounds index\n");
+                         exit (FATAL_EXIT_CODE);
+                       }
                      goto new_statement;
                    }
                }