8144931: Assert class signatures are correct and refer to valid classes
Reviewed-by: vlivanov, psandoz, mhaupt
--- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Sat Feb 20 12:19:36 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Mon Feb 22 09:02:14 2016 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -611,6 +611,31 @@
return true;
}
+ static String className(String cn) {
+ assert checkClassName(cn): "Class not found: " + cn;
+ return cn;
+ }
+
+ static boolean checkClassName(String cn) {
+ Type tp = Type.getType(cn);
+ // additional sanity so only valid "L;" descriptors work
+ if (tp.getSort() != Type.OBJECT) {
+ return false;
+ }
+ try {
+ Class<?> c = Class.forName(tp.getClassName(), false, null);
+ return true;
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+
+ static final String LF_HIDDEN_SIG = className("Ljava/lang/invoke/LambdaForm$Hidden;");
+ static final String LF_COMPILED_SIG = className("Ljava/lang/invoke/LambdaForm$Compiled;");
+ static final String FORCEINLINE_SIG = className("Ljdk/internal/vm/annotation/ForceInline;");
+ static final String DONTINLINE_SIG = className("Ljdk/internal/vm/annotation/DontInline;");
+ static final String INJECTEDPROFILE_SIG = className("Ljava/lang/invoke/InjectedProfile;");
+
/**
* Generate an invoker method for the passed {@link LambdaForm}.
*/
@@ -618,16 +643,16 @@
classFilePrologue();
// Suppress this method in backtraces displayed to the user.
- mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true);
+ mv.visitAnnotation(LF_HIDDEN_SIG, true);
// Mark this method as a compiled LambdaForm
- mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Compiled;", true);
+ mv.visitAnnotation(LF_COMPILED_SIG, true);
if (lambdaForm.forceInline) {
// Force inlining of this invoker method.
- mv.visitAnnotation("Ljdk/internal/vm/annotation/ForceInline;", true);
+ mv.visitAnnotation(FORCEINLINE_SIG, true);
} else {
- mv.visitAnnotation("Ljdk/internal/vm/annotation/DontInline;", true);
+ mv.visitAnnotation(DONTINLINE_SIG, true);
}
if (lambdaForm.customized != null) {
@@ -656,7 +681,7 @@
if (PROFILE_GWT) {
assert(name.arguments[0] instanceof Name &&
nameRefersTo((Name)name.arguments[0], MethodHandleImpl.class, "profileBoolean"));
- mv.visitAnnotation("Ljava/lang/invoke/InjectedProfile;", true);
+ mv.visitAnnotation(INJECTEDPROFILE_SIG, true);
}
onStack = emitSelectAlternative(name, lambdaForm.names[i+1]);
i++; // skip MH.invokeBasic of the selectAlternative result
@@ -1306,10 +1331,10 @@
classFilePrologue();
// Suppress this method in backtraces displayed to the user.
- mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true);
+ mv.visitAnnotation(LF_HIDDEN_SIG, true);
// Don't inline the interpreter entry.
- mv.visitAnnotation("Ljdk/internal/vm/annotation/DontInline;", true);
+ mv.visitAnnotation(DONTINLINE_SIG, true);
// create parameter array
emitIconstInsn(invokerType.parameterCount());
@@ -1365,10 +1390,10 @@
classFilePrologue();
// Suppress this method in backtraces displayed to the user.
- mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true);
+ mv.visitAnnotation(LF_HIDDEN_SIG, true);
// Force inlining of this invoker method.
- mv.visitAnnotation("Ljdk/internal/vm/annotation/ForceInline;", true);
+ mv.visitAnnotation(FORCEINLINE_SIG, true);
// Load receiver
emitAloadInsn(0);