src/share/classes/java/lang/reflect/Executable.java

Print this page

        

@@ -314,25 +314,53 @@
             // may be specific cases.
             out[i] = new Parameter("arg" + i, 0, this, i);
         return out;
     }
 
+    private void verifyParameters(final Parameter[] parameters) {
+        final int mask = Modifier.parameterModifiers();
+
+        if (getParameterTypes().length != parameters.length)
+            throw new MalformedParametersException("Wrong number of parameters in MethodParameters attribute");
+
+        for (Parameter parameter : parameters) {
+            final String name = parameter.getName();
+            final int mods = parameter.getModifiers();
+
+            if (!name.isEmpty() || name.indexOf('.') != -1 ||
+                name.indexOf(';') != -1 && name.indexOf('[') != -1 ||
+                name.indexOf('/') != -1) {
+                throw new MalformedParametersException("Invalid parameter name");
+            }
+
+            if (mods != (mods & mask)) {
+                throw new MalformedParametersException("Invalid parameter modifiers");
+            }
+        }
+    }
+
     private Parameter[] privateGetParameters() {
         // Use tmp to avoid multiple writes to a volatile.
         Parameter[] tmp = parameters;
 
         if (tmp == null) {
 
             // Otherwise, go to the JVM to get them
+            try {
             tmp = getParameters0();
+            } catch(IllegalArgumentException e) {
+                // Rethrow ClassFormatErrors
+                throw new MalformedParametersException("Invalid constant pool index");
+            }
 
             // If we get back nothing, then synthesize parameters
             if (tmp == null) {
                 hasRealParameterData = false;
                 tmp = synthesizeAllParams();
             } else {
                 hasRealParameterData = true;
+                verifyParameters(tmp);
             }
 
             parameters = tmp;
         }