1 /*
   2 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
   3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 *
   5 * This code is free software; you can redistribute it and/or modify it
   6 * under the terms of the GNU General Public License version 2 only, as
   7 * published by the Free Software Foundation.
   8 *
   9 * This code is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12 * version 2 for more details (a copy is included in the LICENSE file that
  13 * accompanied this code).
  14 *
  15 * You should have received a copy of the GNU General Public License version
  16 * 2 along with this work; if not, write to the Free Software Foundation,
  17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18 *
  19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20 * or visit www.oracle.com if you need additional information or have any
  21 * questions.
  22 *
  23 */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/classFileParser.hpp"
  27 #include "classfile/classFileStream.hpp"
  28 #include "classfile/classLoader.hpp"
  29 #include "classfile/classLoaderData.hpp"
  30 #include "classfile/classLoaderData.inline.hpp"
  31 #include "classfile/klassFactory.hpp"
  32 #include "memory/filemap.hpp"
  33 #include "memory/metaspaceShared.hpp"
  34 #include "memory/resourceArea.hpp"
  35 #include "prims/jvmtiEnvBase.hpp"
  36 #include "prims/jvmtiRedefineClasses.hpp"
  37 #include "runtime/handles.inline.hpp"
  38 #include "utilities/macros.hpp"
  39 #if INCLUDE_JFR
  40 #include "jfr/support/jfrKlassExtension.hpp"
  41 #endif
  42 
  43 
  44 // called during initial loading of a shared class
  45 InstanceKlass* KlassFactory::check_shared_class_file_load_hook(
  46                                           InstanceKlass* ik,
  47                                           Symbol* class_name,
  48                                           Handle class_loader,
  49                                           Handle protection_domain, TRAPS) {
  50 #if INCLUDE_CDS && INCLUDE_JVMTI
  51   assert(ik != NULL, "sanity");
  52   assert(ik->is_shared(), "expecting a shared class");
  53 
  54   if (JvmtiExport::should_post_class_file_load_hook()) {
  55     assert(THREAD->is_Java_thread(), "must be JavaThread");
  56 
  57     // Post the CFLH
  58     JvmtiCachedClassFileData* cached_class_file = NULL;
  59     JvmtiCachedClassFileData* archived_class_data = ik->get_archived_class_data();
  60     assert(archived_class_data != NULL, "shared class has no archived class data");
  61     unsigned char* ptr =
  62         VM_RedefineClasses::get_cached_class_file_bytes(archived_class_data);
  63     unsigned char* end_ptr =
  64         ptr + VM_RedefineClasses::get_cached_class_file_len(archived_class_data);
  65     unsigned char* old_ptr = ptr;
  66     JvmtiExport::post_class_file_load_hook(class_name,
  67                                            class_loader,
  68                                            protection_domain,
  69                                            &ptr,
  70                                            &end_ptr,
  71                                            &cached_class_file);
  72     if (old_ptr != ptr) {
  73       // JVMTI agent has modified class file data.
  74       // Set new class file stream using JVMTI agent modified class file data.
  75       ClassLoaderData* loader_data =
  76         ClassLoaderData::class_loader_data(class_loader());
  77       int path_index = ik->shared_classpath_index();
  78       const char* pathname;
  79       if (path_index < 0) {
  80         // shared classes loaded by user defined class loader
  81         // do not have shared_classpath_index
  82         ModuleEntry* mod_entry = ik->module();
  83         if (mod_entry != NULL && (mod_entry->location() != NULL)) {
  84           ResourceMark rm;
  85           pathname = (const char*)(mod_entry->location()->as_C_string());
  86         } else {
  87           pathname = "";
  88         }
  89       } else {
  90         SharedClassPathEntry* ent =
  91           (SharedClassPathEntry*)FileMapInfo::shared_path(path_index);
  92         pathname = ent == NULL ? NULL : ent->name();
  93       }
  94       ClassFileStream* stream = new ClassFileStream(ptr,
  95                                                     end_ptr - ptr,
  96                                                     pathname,
  97                                                     ClassFileStream::verify);
  98       ClassFileParser parser(stream,
  99                              class_name,
 100                              loader_data,
 101                              protection_domain,
 102                              NULL,  // unsafe_anonymous_host
 103                              NULL,  // cp_patches
 104                              false, // is_nonfindable
 105                              ClassFileParser::BROADCAST, // publicity level
 106                              CHECK_NULL);
 107       InstanceKlass* new_ik = parser.create_instance_klass(true /* changed_by_loadhook */,
 108                                                            CHECK_NULL);
 109       if (cached_class_file != NULL) {
 110         new_ik->set_cached_class_file(cached_class_file);
 111       }
 112 
 113       if (class_loader.is_null()) {
 114         ResourceMark rm;
 115         ClassLoader::add_package(class_name->as_C_string(), path_index, THREAD);
 116       }
 117 
 118       return new_ik;
 119     }
 120   }
 121 #endif
 122 
 123   return NULL;
 124 }
 125 
 126 
 127 static ClassFileStream* check_class_file_load_hook(ClassFileStream* stream,
 128                                                    Symbol* name,
 129                                                    ClassLoaderData* loader_data,
 130                                                    Handle protection_domain,
 131                                                    JvmtiCachedClassFileData** cached_class_file,
 132                                                    TRAPS) {
 133 
 134   assert(stream != NULL, "invariant");
 135 
 136   if (JvmtiExport::should_post_class_file_load_hook()) {
 137     assert(THREAD->is_Java_thread(), "must be a JavaThread");
 138     const JavaThread* jt = (JavaThread*)THREAD;
 139 
 140     Handle class_loader(THREAD, loader_data->class_loader());
 141 
 142     // Get the cached class file bytes (if any) from the class that
 143     // is being redefined or retransformed. We use jvmti_thread_state()
 144     // instead of JvmtiThreadState::state_for(jt) so we don't allocate
 145     // a JvmtiThreadState any earlier than necessary. This will help
 146     // avoid the bug described by 7126851.
 147 
 148     JvmtiThreadState* state = jt->jvmti_thread_state();
 149 
 150     if (state != NULL) {
 151       Klass* k = state->get_class_being_redefined();
 152 
 153       if (k != NULL) {
 154         InstanceKlass* class_being_redefined = InstanceKlass::cast(k);
 155         *cached_class_file = class_being_redefined->get_cached_class_file();
 156       }
 157     }
 158 
 159     unsigned char* ptr = const_cast<unsigned char*>(stream->buffer());
 160     unsigned char* end_ptr = ptr + stream->length();
 161 
 162     JvmtiExport::post_class_file_load_hook(name,
 163                                            class_loader,
 164                                            protection_domain,
 165                                            &ptr,
 166                                            &end_ptr,
 167                                            cached_class_file);
 168 
 169     if (ptr != stream->buffer()) {
 170       // JVMTI agent has modified class file data.
 171       // Set new class file stream using JVMTI agent modified class file data.
 172       stream = new ClassFileStream(ptr,
 173                                    end_ptr - ptr,
 174                                    stream->source(),
 175                                    stream->need_verify());
 176     }
 177   }
 178 
 179   return stream;
 180 }
 181 
 182 
 183 InstanceKlass* KlassFactory::create_from_stream(ClassFileStream* stream,
 184                                                 Symbol* name,
 185                                                 ClassLoaderData* loader_data,
 186                                                 Handle protection_domain,
 187                                                 const InstanceKlass* unsafe_anonymous_host,
 188                                                 GrowableArray<Handle>* cp_patches,
 189                                                 bool is_nonfindable,
 190                                                 TRAPS) {
 191   assert(stream != NULL, "invariant");
 192   assert(loader_data != NULL, "invariant");
 193   assert(THREAD->is_Java_thread(), "must be a JavaThread");
 194 
 195   ResourceMark rm;
 196   HandleMark hm;
 197 
 198   JvmtiCachedClassFileData* cached_class_file = NULL;
 199 
 200   ClassFileStream* old_stream = stream;
 201 
 202   // increment counter
 203   THREAD->statistical_info().incr_define_class_count();
 204 
 205   // Skip this processing for VM nonfindable or anonymous classes
 206   if (is_nonfindable || (unsafe_anonymous_host == NULL)) {
 207     stream = check_class_file_load_hook(stream,
 208                                         name,
 209                                         loader_data,
 210                                         protection_domain,
 211                                         &cached_class_file,
 212                                         CHECK_NULL);
 213   }
 214 
 215   ClassFileParser parser(stream,
 216                          name,
 217                          loader_data,
 218                          protection_domain,
 219                          unsafe_anonymous_host,
 220                          cp_patches,
 221                          is_nonfindable,
 222                          ClassFileParser::BROADCAST, // publicity level
 223                          CHECK_NULL);
 224 
 225   InstanceKlass* result = parser.create_instance_klass(old_stream != stream, CHECK_NULL);
 226   assert(result == parser.create_instance_klass(old_stream != stream, THREAD), "invariant");
 227 
 228   if (result == NULL) {
 229     return NULL;
 230   }
 231 
 232   if (cached_class_file != NULL) {
 233     // JVMTI: we have an InstanceKlass now, tell it about the cached bytes
 234     result->set_cached_class_file(cached_class_file);
 235   }
 236 
 237   if (result->should_store_fingerprint()) {
 238     result->store_fingerprint(stream->compute_fingerprint());
 239   }
 240 
 241   JFR_ONLY(ON_KLASS_CREATION(result, parser, THREAD);)
 242 
 243 #if INCLUDE_CDS
 244   if (DumpSharedSpaces) {
 245     ClassLoader::record_result(result, stream, THREAD);
 246 #if INCLUDE_JVMTI
 247     assert(cached_class_file == NULL, "Sanity");
 248     // Archive the class stream data into the optional data section
 249     JvmtiCachedClassFileData *p;
 250     int len;
 251     const unsigned char *bytes;
 252     // event based tracing might set cached_class_file
 253     if ((bytes = result->get_cached_class_file_bytes()) != NULL) {
 254       len = result->get_cached_class_file_len();
 255     } else {
 256       len = stream->length();
 257       bytes = stream->buffer();
 258     }
 259     p = (JvmtiCachedClassFileData*)os::malloc(offset_of(JvmtiCachedClassFileData, data) + len, mtInternal);
 260     p->length = len;
 261     memcpy(p->data, bytes, len);
 262     result->set_archived_class_data(p);
 263 #endif // INCLUDE_JVMTI
 264   }
 265 #endif // INCLUDE_CDS
 266 
 267   return result;
 268 }