Mercurial > hg > graal-jvmci-8
annotate src/share/vm/classfile/sharedPathsMiscInfo.cpp @ 23660:b5f3a471e646
Merge.
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 01 Jun 2016 00:11:44 +0200 |
parents | f46ffa934a46 |
children |
rev | line source |
---|---|
20375 | 1 /* |
23462
f46ffa934a46
8143963: improve ClassLoader::trace_class_path to accept an additional outputStream* arg
ccheung
parents:
20376
diff
changeset
|
2 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. |
20375 | 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/classLoader.hpp" | |
27 #include "classfile/classLoaderData.inline.hpp" | |
28 #include "classfile/sharedPathsMiscInfo.hpp" | |
29 #include "memory/allocation.inline.hpp" | |
30 #include "memory/metaspaceShared.hpp" | |
31 #include "runtime/arguments.hpp" | |
32 | |
33 void SharedPathsMiscInfo::add_path(const char* path, int type) { | |
34 if (TraceClassPaths) { | |
35 tty->print("[type=%s] ", type_name(type)); | |
36 trace_class_path("[Add misc shared path ", path); | |
37 } | |
38 write(path, strlen(path) + 1); | |
39 write_jint(jint(type)); | |
40 } | |
41 | |
42 void SharedPathsMiscInfo::ensure_size(size_t needed_bytes) { | |
43 assert(_allocated, "cannot modify buffer during validation."); | |
44 int used = get_used_bytes(); | |
45 int target = used + int(needed_bytes); | |
46 if (target > _buf_size) { | |
47 _buf_size = _buf_size * 2 + (int)needed_bytes; | |
48 _buf_start = REALLOC_C_HEAP_ARRAY(char, _buf_start, _buf_size, mtClass); | |
49 _cur_ptr = _buf_start + used; | |
50 _end_ptr = _buf_start + _buf_size; | |
51 } | |
52 } | |
53 | |
54 void SharedPathsMiscInfo::write(const void* ptr, size_t size) { | |
55 ensure_size(size); | |
56 memcpy(_cur_ptr, ptr, size); | |
57 _cur_ptr += size; | |
58 } | |
59 | |
60 bool SharedPathsMiscInfo::read(void* ptr, size_t size) { | |
61 if (_cur_ptr + size <= _end_ptr) { | |
62 memcpy(ptr, _cur_ptr, size); | |
63 _cur_ptr += size; | |
64 return true; | |
65 } | |
66 return false; | |
67 } | |
68 | |
69 bool SharedPathsMiscInfo::fail(const char* msg, const char* name) { | |
23462
f46ffa934a46
8143963: improve ClassLoader::trace_class_path to accept an additional outputStream* arg
ccheung
parents:
20376
diff
changeset
|
70 ClassLoader::trace_class_path(tty, msg, name); |
20375 | 71 MetaspaceShared::set_archive_loading_failed(); |
72 return false; | |
73 } | |
74 | |
75 bool SharedPathsMiscInfo::check() { | |
76 // The whole buffer must be 0 terminated so that we can use strlen and strcmp | |
77 // without fear. | |
78 _end_ptr -= sizeof(jint); | |
79 if (_cur_ptr >= _end_ptr) { | |
80 return fail("Truncated archive file header"); | |
81 } | |
82 if (*_end_ptr != 0) { | |
83 return fail("Corrupted archive file header"); | |
84 } | |
85 | |
86 while (_cur_ptr < _end_ptr) { | |
87 jint type; | |
88 const char* path = _cur_ptr; | |
89 _cur_ptr += strlen(path) + 1; | |
90 if (!read_jint(&type)) { | |
91 return fail("Corrupted archive file header"); | |
92 } | |
93 if (TraceClassPaths) { | |
94 tty->print("[type=%s ", type_name(type)); | |
95 print_path(tty, type, path); | |
96 tty->print_cr("]"); | |
97 } | |
98 if (!check(type, path)) { | |
99 if (!PrintSharedArchiveAndExit) { | |
100 return false; | |
101 } | |
102 } else { | |
103 trace_class_path("[ok"); | |
104 } | |
105 } | |
106 | |
107 return true; | |
108 } | |
109 | |
110 bool SharedPathsMiscInfo::check(jint type, const char* path) { | |
111 switch (type) { | |
112 case BOOT: | |
113 if (strcmp(path, Arguments::get_sysclasspath()) != 0) { | |
114 return fail("[BOOT classpath mismatch, actual: -Dsun.boot.class.path=", Arguments::get_sysclasspath()); | |
115 } | |
116 break; | |
117 case NON_EXIST: // fall-through | |
118 case REQUIRED: | |
119 { | |
120 struct stat st; | |
121 if (os::stat(path, &st) != 0) { | |
122 // The file does not actually exist | |
123 if (type == REQUIRED) { | |
124 // but we require it to exist -> fail | |
125 return fail("Required file doesn't exist"); | |
126 } | |
127 } else { | |
128 // The file actually exists | |
129 if (type == NON_EXIST) { | |
130 // But we want it to not exist -> fail | |
131 return fail("File must not exist"); | |
132 } | |
133 time_t timestamp; | |
134 long filesize; | |
135 | |
136 if (!read_time(×tamp) || !read_long(&filesize)) { | |
137 return fail("Corrupted archive file header"); | |
138 } | |
139 if (timestamp != st.st_mtime) { | |
140 return fail("Timestamp mismatch"); | |
141 } | |
20376 | 142 if (filesize != st.st_size) { |
20375 | 143 return fail("File size mismatch"); |
144 } | |
145 } | |
146 } | |
147 break; | |
148 | |
149 default: | |
150 return fail("Corrupted archive file header"); | |
151 } | |
152 | |
153 return true; | |
154 } |