src/share/vm/classfile/resolutionErrors.cpp

Thu, 25 Aug 2016 09:23:45 -0400

author
zgu
date
Thu, 25 Aug 2016 09:23:45 -0400
changeset 9969
40f45911050f
parent 9966
baf9f57c9b46
child 10015
eb7ce841ccec
permissions
-rw-r--r--

8148854: Class names "SomeClass" and "LSomeClass;" treated by JVM as an equivalent
Summary: Added default format checking of class names loaded by the app class loader
Reviewed-by: andrew

     1 /*
     2  * Copyright (c) 2005, 2014, 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  */
    25 #include "precompiled.hpp"
    26 #include "classfile/resolutionErrors.hpp"
    27 #include "memory/resourceArea.hpp"
    28 #include "oops/oop.inline.hpp"
    29 #include "runtime/handles.inline.hpp"
    30 #include "runtime/safepoint.hpp"
    31 #include "utilities/hashtable.inline.hpp"
    33 // add new entry to the table
    34 void ResolutionErrorTable::add_entry(int index, unsigned int hash,
    35                                      constantPoolHandle pool, int cp_index,
    36                                      Symbol* error, Symbol* message)
    37 {
    38   assert_locked_or_safepoint(SystemDictionary_lock);
    39   assert(!pool.is_null() && error != NULL, "adding NULL obj");
    41   ResolutionErrorEntry* entry = new_entry(hash, pool(), cp_index, error, message);
    42   add_entry(index, entry);
    43 }
    45 // find entry in the table
    46 ResolutionErrorEntry* ResolutionErrorTable::find_entry(int index, unsigned int hash,
    47                                                        constantPoolHandle pool, int cp_index)
    48 {
    49   assert_locked_or_safepoint(SystemDictionary_lock);
    51   for (ResolutionErrorEntry *error_probe = bucket(index);
    52                          error_probe != NULL;
    53                          error_probe = error_probe->next()) {
    54   if (error_probe->hash() == hash && error_probe->pool() == pool()) {
    55       return error_probe;;
    56     }
    57   }
    58   return NULL;
    59 }
    61 void ResolutionErrorEntry::set_error(Symbol* e) {
    62   assert(e != NULL, "must set a value");
    63   _error = e;
    64   _error->increment_refcount();
    65 }
    67 void ResolutionErrorEntry::set_message(Symbol* c) {
    68   assert(c != NULL, "must set a value");
    69   _message = c;
    70   _message->increment_refcount();
    71 }
    73 // create new error entry
    74 ResolutionErrorEntry* ResolutionErrorTable::new_entry(int hash, ConstantPool* pool,
    75                                                       int cp_index, Symbol* error,
    76                                                       Symbol* message)
    77 {
    78   ResolutionErrorEntry* entry = (ResolutionErrorEntry*)Hashtable<ConstantPool*, mtClass>::new_entry(hash, pool);
    79   entry->set_cp_index(cp_index);
    80   entry->set_error(error);
    81   entry->set_message(message);
    83   return entry;
    84 }
    86 void ResolutionErrorTable::free_entry(ResolutionErrorEntry *entry) {
    87   // decrement error refcount
    88   assert(entry->error() != NULL, "error should be set");
    89   entry->error()->decrement_refcount();
    90   entry->message()->decrement_refcount();
    91   Hashtable<ConstantPool*, mtClass>::free_entry(entry);
    92 }
    95 // create resolution error table
    96 ResolutionErrorTable::ResolutionErrorTable(int table_size)
    97     : Hashtable<ConstantPool*, mtClass>(table_size, sizeof(ResolutionErrorEntry)) {
    98 }
   100 // RedefineClasses support - remove matching entry of a
   101 // constant pool that is going away
   102 void ResolutionErrorTable::delete_entry(ConstantPool* c) {
   103   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   104   for (int i = 0; i < table_size(); i++) {
   105     for (ResolutionErrorEntry** p = bucket_addr(i); *p != NULL; ) {
   106       ResolutionErrorEntry* entry = *p;
   107       assert(entry->pool() != NULL, "resolution error table is corrupt");
   108       if (entry->pool() == c) {
   109         *p = entry->next();
   110         free_entry(entry);
   111       } else {
   112         p = entry->next_addr();
   113       }
   114     }
   115   }
   116 }
   119 // Remove unloaded entries from the table
   120 void ResolutionErrorTable::purge_resolution_errors() {
   121   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
   122   for (int i = 0; i < table_size(); i++) {
   123     for (ResolutionErrorEntry** p = bucket_addr(i); *p != NULL; ) {
   124       ResolutionErrorEntry* entry = *p;
   125       assert(entry->pool() != (ConstantPool*)NULL, "resolution error table is corrupt");
   126       ConstantPool* pool = entry->pool();
   127       assert(pool->pool_holder() != NULL, "Constant pool without a class?");
   128       ClassLoaderData* loader_data =
   129               pool->pool_holder()->class_loader_data();
   130       if (!loader_data->is_unloading()) {
   131         p = entry->next_addr();
   132       } else {
   133         *p = entry->next();
   134         free_entry(entry);
   135       }
   136     }
   137   }
   138 }

mercurial