< prev index next >

src/hotspot/share/memory/filemap.cpp

Print this page

        

*** 213,222 **** --- 213,223 ---- _magic = CDS_DYNAMIC_ARCHIVE_MAGIC; } else { _magic = CDS_ARCHIVE_MAGIC; } _version = CURRENT_CDS_ARCHIVE_VERSION; + _end_magic = CDS_END_MAGIC; _alignment = alignment; _obj_alignment = ObjectAlignmentInBytes; _compact_strings = CompactStrings; _narrow_oop_mode = CompressedOops::mode(); _narrow_oop_base = CompressedOops::base();
*** 889,902 **** --- 890,955 ---- size_t n = os::read(fd, _header, (unsigned int)sz); if (n != sz) { fail_continue("Unable to read the file header."); return false; } + + if (!Arguments::has_jimage()) { + FileMapInfo::fail_continue("The shared archive file cannot be used with an exploded module build."); + return false; + } + + if (_header->_magic != CDS_ARCHIVE_MAGIC && _header->_magic != CDS_DYNAMIC_ARCHIVE_MAGIC) { + unsigned int expected_magic = is_static ? CDS_ARCHIVE_MAGIC : CDS_DYNAMIC_ARCHIVE_MAGIC; + log_info(cds)("_magic expected: 0x%08x", expected_magic); + log_info(cds)(" actual: 0x%08x", _header->_magic); + FileMapInfo::fail_continue("The shared archive file has a bad magic number."); + return false; + } + if (_header->_version != CURRENT_CDS_ARCHIVE_VERSION) { + log_info(cds)("_version expected: %d", CURRENT_CDS_ARCHIVE_VERSION); + log_info(cds)(" actual: %d", _header->_version); fail_continue("The shared archive file has the wrong version."); return false; } + + if (_header->_end_magic != CDS_END_MAGIC) { + log_info(cds)("_end_magic expected: 0x%08x", CDS_END_MAGIC); + log_info(cds)(" actual: 0x%08x", _header->_end_magic); + FileMapInfo::fail_continue("The shared archive file has a bad end magic number."); + return false; + } + + if (_header->_header_size != sz) { + log_info(cds)("_header_size expected: " SIZE_FORMAT, sz); + log_info(cds)(" actual: " SIZE_FORMAT, _header->_header_size); + FileMapInfo::fail_continue("The shared archive file has an incorrect header size."); + return false; + } + + char header_version[JVM_IDENT_MAX]; + get_header_version(header_version); + if (strncmp(_header->_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) { + log_info(class, path)("expected: %s", header_version); + _header->_end_magic = 0x0; // just in case _header->_jvm_ident is not 0-terminated + log_info(class, path)("actual: %s", _header->_jvm_ident); + FileMapInfo::fail_continue("The shared archive file was created by a different" + " version or build of HotSpot"); + return false; + } + + if (VerifySharedSpaces) { + int expected_crc = _header->compute_crc(); + if (expected_crc != _header->_crc) { + log_info(cds)("_crc expected: %d", expected_crc); + log_info(cds)(" actual: %d", _header->_crc); + FileMapInfo::fail_continue("Header checksum verification failed."); + return false; + } + } + _file_offset = n; size_t info_size = _header->_paths_misc_info_size; _paths_misc_info = NEW_C_HEAP_ARRAY(char, info_size, mtClass); n = os::read(fd, _paths_misc_info, (unsigned int)info_size);
*** 1748,1784 **** return crc; } // This function should only be called during run time with UseSharedSpaces enabled. bool FileMapHeader::validate() { - if (VerifySharedSpaces && compute_crc() != _crc) { - FileMapInfo::fail_continue("Header checksum verification failed."); - return false; - } - - if (!Arguments::has_jimage()) { - FileMapInfo::fail_continue("The shared archive file cannot be used with an exploded module build."); - return false; - } - if (_version != CURRENT_CDS_ARCHIVE_VERSION) { - FileMapInfo::fail_continue("The shared archive file is the wrong version."); - return false; - } - if (_magic != CDS_ARCHIVE_MAGIC && _magic != CDS_DYNAMIC_ARCHIVE_MAGIC) { - FileMapInfo::fail_continue("The shared archive file has a bad magic number."); - return false; - } - char header_version[JVM_IDENT_MAX]; - get_header_version(header_version); - if (strncmp(_jvm_ident, header_version, JVM_IDENT_MAX-1) != 0) { - log_info(class, path)("expected: %s", header_version); - log_info(class, path)("actual: %s", _jvm_ident); - FileMapInfo::fail_continue("The shared archive file was created by a different" - " version or build of HotSpot"); - return false; - } if (_obj_alignment != ObjectAlignmentInBytes) { FileMapInfo::fail_continue("The shared archive file's ObjectAlignmentInBytes of %d" " does not equal the current ObjectAlignmentInBytes of " INTX_FORMAT ".", _obj_alignment, ObjectAlignmentInBytes); return false; --- 1801,1811 ----
< prev index next >