-
Notifications
You must be signed in to change notification settings - Fork 5.8k
8333812: ClassFile.verify() can throw exceptions instead of returning VerifyErrors #20241
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
👋 Welcome back asotona! A progress list of the required criteria for merging this PR into |
@asotona This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be:
You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 17 new commits pushed to the
As there are no conflicts, your changes will automatically be rebased on top of these commits when integrating. If you prefer to avoid this automatic rebasing, please check the documentation for the /integrate command for further details. ➡️ To integrate this PR with the above commit message to the |
Webrevs
|
@@ -114,9 +114,10 @@ public static List<VerifyError> verify(ClassModel classModel, Consumer<String> l | |||
} | |||
|
|||
public static List<VerifyError> verify(ClassModel classModel, ClassHierarchyResolver classHierarchyResolver, Consumer<String> logger) { | |||
var klass = new VerificationWrapper(classModel); | |||
log_info(logger, "Start class verification for: %s", klass.thisClassName()); | |||
String clsName = classModel.thisClass().asInternalName(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This can still throw ConstantPoolException
if this_class points to a non-Class entry. This entry is lazily read by ClassReader
, so you can create a ClassModel
for such a bad class.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alternatively, a malformed Class constant can point to a non-utf8, so the asInternalName
can fail too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, it will still throw if you pass a broken model to ClassFile::verify(ClassModel)
.
I'll catch this top-level exception in both ClassFile::verify
methods.
Thank you. /integrate |
Going to push as commit c25c489.
Your commit was automatically rebased without conflicts. |
try { | ||
return VerifierImpl.verify(model, classHierarchyResolverOption().classHierarchyResolver(), null); | ||
} catch (IllegalArgumentException verifierInitializationError) { | ||
return List.of(new VerifyError(verifierInitializationError.getMessage())); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note that the list returned by VerifierImpl.verify(…)
is mutable, whereas List.of(…)
is unmodifiable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good observation; we should check that all collection-returning APIs in ClassFile API are immutable.
ClassFile.verify()
should always return list of verification errors and never throw an exception, even for corrupted classes.BoundAttribute
initializations ofLocalVariableTable
andLocalVariableTypeTable
attributes do not expect invalid possible locations and causeClassCastException
.This patch fixes
BoundAttribute
to throwIllegalArgumentException
for invalidLocalVariableTable
andLocalVariableTypeTable
attributes locations. And makesVerifierImpl
a bit more resilient to exceptions thrown from the verifier initialization.Relevant test is added.
Please review.
Thanks,
Adam
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/20241/head:pull/20241
$ git checkout pull/20241
Update a local copy of the PR:
$ git checkout pull/20241
$ git pull https://git.openjdk.org/jdk.git pull/20241/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 20241
View PR using the GUI difftool:
$ git pr show -t 20241
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/20241.diff
Webrev
Link to Webrev Comment