OSDN Git Service

Fix for PR java/2369:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 Feb 2002 00:42:13 +0000 (00:42 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 23 Feb 2002 00:42:13 +0000 (00:42 +0000)
* jvspec.c (verify_class_name): New function.
(lang_specific_driver): Call it.
(JAVA_START_CHAR_P): New macro.
(JAVA_PART_CHAR_P): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49981 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/jvspec.c

index 0bed76d..ffd0b6b 100644 (file)
@@ -1,3 +1,11 @@
+2002-02-22  Tom Tromey  <tromey@redhat.com>
+
+       Fix for PR java/2369:
+       * jvspec.c (verify_class_name): New function.
+       (lang_specific_driver): Call it.
+       (JAVA_START_CHAR_P): New macro.
+       (JAVA_PART_CHAR_P): Likewise.
+
 2002-02-22  Per Bothner  <per@bothner.com>
 
        *  class.c:  Change vtable to be more compatible with g++ v3 abi.
index dba2ee6..5bb3e9d 100644 (file)
@@ -46,6 +46,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 #define RESOURCE_FILE_ARG (1<<7)
 
 static char *find_spec_file    PARAMS ((const char *));
+static int verify_class_name    PARAMS ((const char *));
 
 static const char *main_class_name = NULL;
 int lang_specific_extra_outfiles = 0;
@@ -98,6 +99,45 @@ find_spec_file (dir)
   return NULL;
 }
 
+/* FIXME: these should come from lex.h.  */
+#define JAVA_START_CHAR_P(c) (c < 128 && (ISIDST (c) || c == '$'))
+#define JAVA_PART_CHAR_P(c) (c < 128                                         \
+                            && (ISIDNUM (c)                                  \
+                                || c == '$'                                  \
+                                || (c >= 0x00 && c <= 0x08)                  \
+                                || (c >= 0x0e && c <= 0x1b)                  \
+                                || c == 0x7f))
+
+/* Verify that NAME is a valid Java class name that might contain
+   `main'.  Return 0 on failure.  */
+static int
+verify_class_name (name)
+     const char *name;
+{
+  /* FIXME: what encoding do we use for command-line arguments?  For
+     now we assume plain ASCII, which of course is wrong.  */
+  while (*name)
+    {
+      int ch = *name++;
+      if (ch < 0 || ! JAVA_START_CHAR_P (ch))
+       return 0;
+      while (*name)
+       {
+         ch = *name++;
+         if (ch < 0)
+           return 0;
+         /* We found a break between class names.  Next character
+            must be an identifier start again.  */
+         if (ch == '.')
+           break;
+         if (! JAVA_PART_CHAR_P (ch))
+           return 0;
+       }
+    }
+
+  return 1;
+}
+
 void
 lang_specific_driver (in_argc, in_argv, in_added_libraries)
      int *in_argc;
@@ -383,6 +423,9 @@ lang_specific_driver (in_argc, in_argv, in_added_libraries)
   if (saw_D && ! main_class_name)
     fatal ("can't specify `-D' without `--main'\n");
 
+  if (main_class_name && ! verify_class_name (main_class_name))
+    fatal ("`%s' is not a valid class name", main_class_name);
+
   num_args = argc + added;
   if (saw_R)
     {