Wed, 19 Nov 2014 18:14:01 +0100
8065361: Fixup headers and definitions for INCLUDE_TRACE
Reviewed-by: sla, stefank
iklam@7089 | 1 | /* |
iklam@7089 | 2 | * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. |
iklam@7089 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
iklam@7089 | 4 | * |
iklam@7089 | 5 | * This code is free software; you can redistribute it and/or modify it |
iklam@7089 | 6 | * under the terms of the GNU General Public License version 2 only, as |
iklam@7089 | 7 | * published by the Free Software Foundation. |
iklam@7089 | 8 | * |
iklam@7089 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
iklam@7089 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
iklam@7089 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
iklam@7089 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
iklam@7089 | 13 | * accompanied this code). |
iklam@7089 | 14 | * |
iklam@7089 | 15 | * You should have received a copy of the GNU General Public License version |
iklam@7089 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
iklam@7089 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
iklam@7089 | 18 | * |
iklam@7089 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
iklam@7089 | 20 | * or visit www.oracle.com if you need additional information or have any |
iklam@7089 | 21 | * questions. |
iklam@7089 | 22 | * |
iklam@7089 | 23 | */ |
iklam@7089 | 24 | |
iklam@7089 | 25 | #include "precompiled.hpp" |
iklam@7089 | 26 | #include "classfile/classLoader.hpp" |
iklam@7089 | 27 | #include "classfile/classLoaderData.inline.hpp" |
iklam@7089 | 28 | #include "classfile/sharedPathsMiscInfo.hpp" |
iklam@7089 | 29 | #include "memory/allocation.inline.hpp" |
iklam@7089 | 30 | #include "memory/metaspaceShared.hpp" |
iklam@7089 | 31 | #include "runtime/arguments.hpp" |
iklam@7089 | 32 | |
iklam@7089 | 33 | void SharedPathsMiscInfo::add_path(const char* path, int type) { |
iklam@7089 | 34 | if (TraceClassPaths) { |
iklam@7089 | 35 | tty->print("[type=%s] ", type_name(type)); |
iklam@7089 | 36 | trace_class_path("[Add misc shared path ", path); |
iklam@7089 | 37 | } |
iklam@7089 | 38 | write(path, strlen(path) + 1); |
iklam@7089 | 39 | write_jint(jint(type)); |
iklam@7089 | 40 | } |
iklam@7089 | 41 | |
iklam@7089 | 42 | void SharedPathsMiscInfo::ensure_size(size_t needed_bytes) { |
iklam@7089 | 43 | assert(_allocated, "cannot modify buffer during validation."); |
iklam@7089 | 44 | int used = get_used_bytes(); |
iklam@7089 | 45 | int target = used + int(needed_bytes); |
iklam@7089 | 46 | if (target > _buf_size) { |
iklam@7089 | 47 | _buf_size = _buf_size * 2 + (int)needed_bytes; |
iklam@7089 | 48 | _buf_start = REALLOC_C_HEAP_ARRAY(char, _buf_start, _buf_size, mtClass); |
iklam@7089 | 49 | _cur_ptr = _buf_start + used; |
iklam@7089 | 50 | _end_ptr = _buf_start + _buf_size; |
iklam@7089 | 51 | } |
iklam@7089 | 52 | } |
iklam@7089 | 53 | |
iklam@7089 | 54 | void SharedPathsMiscInfo::write(const void* ptr, size_t size) { |
iklam@7089 | 55 | ensure_size(size); |
iklam@7089 | 56 | memcpy(_cur_ptr, ptr, size); |
iklam@7089 | 57 | _cur_ptr += size; |
iklam@7089 | 58 | } |
iklam@7089 | 59 | |
iklam@7089 | 60 | bool SharedPathsMiscInfo::read(void* ptr, size_t size) { |
iklam@7089 | 61 | if (_cur_ptr + size <= _end_ptr) { |
iklam@7089 | 62 | memcpy(ptr, _cur_ptr, size); |
iklam@7089 | 63 | _cur_ptr += size; |
iklam@7089 | 64 | return true; |
iklam@7089 | 65 | } |
iklam@7089 | 66 | return false; |
iklam@7089 | 67 | } |
iklam@7089 | 68 | |
iklam@7089 | 69 | bool SharedPathsMiscInfo::fail(const char* msg, const char* name) { |
iklam@7089 | 70 | ClassLoader::trace_class_path(msg, name); |
iklam@7089 | 71 | MetaspaceShared::set_archive_loading_failed(); |
iklam@7089 | 72 | return false; |
iklam@7089 | 73 | } |
iklam@7089 | 74 | |
iklam@7089 | 75 | bool SharedPathsMiscInfo::check() { |
iklam@7089 | 76 | // The whole buffer must be 0 terminated so that we can use strlen and strcmp |
iklam@7089 | 77 | // without fear. |
iklam@7089 | 78 | _end_ptr -= sizeof(jint); |
iklam@7089 | 79 | if (_cur_ptr >= _end_ptr) { |
iklam@7089 | 80 | return fail("Truncated archive file header"); |
iklam@7089 | 81 | } |
iklam@7089 | 82 | if (*_end_ptr != 0) { |
iklam@7089 | 83 | return fail("Corrupted archive file header"); |
iklam@7089 | 84 | } |
iklam@7089 | 85 | |
iklam@7089 | 86 | while (_cur_ptr < _end_ptr) { |
iklam@7089 | 87 | jint type; |
iklam@7089 | 88 | const char* path = _cur_ptr; |
iklam@7089 | 89 | _cur_ptr += strlen(path) + 1; |
iklam@7089 | 90 | if (!read_jint(&type)) { |
iklam@7089 | 91 | return fail("Corrupted archive file header"); |
iklam@7089 | 92 | } |
iklam@7089 | 93 | if (TraceClassPaths) { |
iklam@7089 | 94 | tty->print("[type=%s ", type_name(type)); |
iklam@7089 | 95 | print_path(tty, type, path); |
iklam@7089 | 96 | tty->print_cr("]"); |
iklam@7089 | 97 | } |
iklam@7089 | 98 | if (!check(type, path)) { |
iklam@7089 | 99 | if (!PrintSharedArchiveAndExit) { |
iklam@7089 | 100 | return false; |
iklam@7089 | 101 | } |
iklam@7089 | 102 | } else { |
iklam@7089 | 103 | trace_class_path("[ok"); |
iklam@7089 | 104 | } |
iklam@7089 | 105 | } |
iklam@7089 | 106 | |
iklam@7089 | 107 | return true; |
iklam@7089 | 108 | } |
iklam@7089 | 109 | |
iklam@7089 | 110 | bool SharedPathsMiscInfo::check(jint type, const char* path) { |
iklam@7089 | 111 | switch (type) { |
iklam@7089 | 112 | case BOOT: |
iklam@7089 | 113 | if (strcmp(path, Arguments::get_sysclasspath()) != 0) { |
iklam@7089 | 114 | return fail("[BOOT classpath mismatch, actual: -Dsun.boot.class.path=", Arguments::get_sysclasspath()); |
iklam@7089 | 115 | } |
iklam@7089 | 116 | break; |
iklam@7089 | 117 | case NON_EXIST: // fall-through |
iklam@7089 | 118 | case REQUIRED: |
iklam@7089 | 119 | { |
iklam@7089 | 120 | struct stat st; |
iklam@7089 | 121 | if (os::stat(path, &st) != 0) { |
iklam@7089 | 122 | // The file does not actually exist |
iklam@7089 | 123 | if (type == REQUIRED) { |
iklam@7089 | 124 | // but we require it to exist -> fail |
iklam@7089 | 125 | return fail("Required file doesn't exist"); |
iklam@7089 | 126 | } |
iklam@7089 | 127 | } else { |
iklam@7089 | 128 | // The file actually exists |
iklam@7089 | 129 | if (type == NON_EXIST) { |
iklam@7089 | 130 | // But we want it to not exist -> fail |
iklam@7089 | 131 | return fail("File must not exist"); |
iklam@7089 | 132 | } |
iklam@7089 | 133 | time_t timestamp; |
iklam@7089 | 134 | long filesize; |
iklam@7089 | 135 | |
iklam@7089 | 136 | if (!read_time(×tamp) || !read_long(&filesize)) { |
iklam@7089 | 137 | return fail("Corrupted archive file header"); |
iklam@7089 | 138 | } |
iklam@7089 | 139 | if (timestamp != st.st_mtime) { |
iklam@7089 | 140 | return fail("Timestamp mismatch"); |
iklam@7089 | 141 | } |
iklam@7090 | 142 | if (filesize != st.st_size) { |
iklam@7089 | 143 | return fail("File size mismatch"); |
iklam@7089 | 144 | } |
iklam@7089 | 145 | } |
iklam@7089 | 146 | } |
iklam@7089 | 147 | break; |
iklam@7089 | 148 | |
iklam@7089 | 149 | default: |
iklam@7089 | 150 | return fail("Corrupted archive file header"); |
iklam@7089 | 151 | } |
iklam@7089 | 152 | |
iklam@7089 | 153 | return true; |
iklam@7089 | 154 | } |