-
Notifications
You must be signed in to change notification settings - Fork 5.8k
8315890: Attempts to load from nullptr in instanceKlass.cpp and unsafe.cpp #16405
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 matsaave! A progress list of the required criteria for merging this PR into |
@matias9927 The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
Webrevs
|
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.
Looks good.
@matias9927 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 275 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 |
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.
LGTM
InstanceKlass* volatile* iklass = adr_implementor(); | ||
InstanceKlass* impl = (iklass != nullptr) ? Atomic::load_acquire(iklass) : nullptr; |
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 looks very klunky as we do a raw read, check it for null then re-read with acquire semantics. Cleaner IMO to do a raw read followed by a raw OrderAccess::acquire()
and no need for a null check.
src/hotspot/share/prims/unsafe.cpp
Outdated
@@ -231,6 +231,7 @@ class MemoryAccess : StackObj { | |||
|
|||
T get_volatile() { | |||
GuardUnsafeAccess guard(_thread); | |||
assert(addr() != nullptr, "Attempting to load from null pointer"); |
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.
I don't see how addr()
can be null unless _obj
was null - which would be a usage error. So asserting _obj != nullptr
in the constructor would seem better to me. I mean no point checking addr()
here but not in other functions where we dereference it!
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.
Yes, this looks better. This was the source of the nullptr, except in these two cases, the pointer is never null.
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.
Updated changes look good.
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.
Not sure why it needed to be lifted out of Unsafe. The issue description should be updated now.
Sorry, I meant to explain this change in response to your comments. I'll explain here: The call stack that results in the issue shown in |
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.
Okay. Thanks
Thanks for the reviews @coleenp , @calvinccheung , and @dholmes-ora! |
Going to push as commit 7a7b1e5.
Your commit was automatically rebased without conflicts. |
@matias9927 Pushed as commit 7a7b1e5. 💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored. |
Calls in instanceKlass.cpp and unsafe.cpp try to call an atomic load on method calls that could return nullptr. This patch ensures that nullptr is not passed into the load.
In
print_as_native_pointer
in archiveBuilder,source_obj_to_requested_obj
should not be able to returnnullptr
as the result is immediately cast to an oop which cascades down to the failure reported inget_volatile()
inunsafe.cpp
. Placing an assert close to the top of this call stack should prevent this from happening and will better indicate the source of an unexpectednullptr
should it occur.Verified with tier1-5 tests.
Progress
Issue
Reviewers
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/16405/head:pull/16405
$ git checkout pull/16405
Update a local copy of the PR:
$ git checkout pull/16405
$ git pull https://git.openjdk.org/jdk.git pull/16405/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 16405
View PR using the GUI difftool:
$ git pr show -t 16405
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/16405.diff
Webrev
Link to Webrev Comment