changeset 24367:1eaa9a72d705

8180813: Null pointer dereference of CodeCache::find_blob() result Summary: Fixed missing null checks on the result of CodeCache::find_blob() found by Parfait. Reviewed-by: shade, kvn
author thartmann
date Wed, 24 May 2017 16:53:58 +0200
parents 5c6e2c667464
children 3c3a934f88c2
files src/share/vm/code/relocInfo.cpp src/share/vm/runtime/sharedRuntime.cpp
diffstat 2 files changed, 5 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/code/relocInfo.cpp	Mon May 22 09:23:59 2017 +0200
+++ b/src/share/vm/code/relocInfo.cpp	Wed May 24 16:53:58 2017 +0200
@@ -128,9 +128,9 @@
   if (nm == NULL && begin != NULL) {
     // allow nmethod to be deduced from beginning address
     CodeBlob* cb = CodeCache::find_blob(begin);
-    nm = cb->as_nmethod_or_null();
+    nm = (cb != NULL) ? cb->as_nmethod_or_null() : NULL;
   }
-  assert(nm != NULL, "must be able to deduce nmethod from other arguments");
+  guarantee(nm != NULL, "must be able to deduce nmethod from other arguments");
 
   _code    = nm;
   _current = nm->relocation_begin() - 1;
--- a/src/share/vm/runtime/sharedRuntime.cpp	Mon May 22 09:23:59 2017 +0200
+++ b/src/share/vm/runtime/sharedRuntime.cpp	Wed May 24 16:53:58 2017 +0200
@@ -546,7 +546,7 @@
   CodeBlob *cb = CodeCache::find_blob(pc);
 
   // Should be an nmethod
-  assert( cb && cb->is_nmethod(), "safepoint polling: pc must refer to an nmethod" );
+  guarantee(cb != NULL && cb->is_nmethod(), "safepoint polling: pc must refer to an nmethod");
 
   // Look up the relocation information
   assert( ((nmethod*)cb)->is_at_poll_or_poll_return(pc),
@@ -1709,7 +1709,7 @@
   // ask me how I know this...
 
   CodeBlob* cb = CodeCache::find_blob(caller_pc);
-  if (!cb->is_nmethod() || entry_point == moop->get_c2i_entry()) {
+  if (cb == NULL || !cb->is_nmethod() || entry_point == moop->get_c2i_entry()) {
     return;
   }
 
@@ -1760,7 +1760,7 @@
       if (destination != entry_point) {
         CodeBlob* callee = CodeCache::find_blob(destination);
         // callee == cb seems weird. It means calling interpreter thru stub.
-        if (callee == cb || callee->is_adapter_blob()) {
+        if (callee != NULL && (callee == cb || callee->is_adapter_blob())) {
           // static call or optimized virtual
           if (TraceCallFixup) {
             tty->print("fixup callsite           at " INTPTR_FORMAT " to compiled code for", caller_pc);