< prev index next >

src/hotspot/share/memory/filemap.cpp

Print this page

        

*** 153,162 **** --- 153,164 ---- assert(N == JVM_IDENT_MAX, "Bad header_version size"); const char *vm_version = VM_Version::internal_vm_info_string(); const int version_len = (int)strlen(vm_version); + memset(header_version, 0, JVM_IDENT_MAX); + if (version_len < (JVM_IDENT_MAX-1)) { strcpy(header_version, vm_version); } else { // Get the hash value. Use a static seed because the hash needs to return the same
*** 168,177 **** --- 170,181 ---- // Append the hash code as eight hex digits. sprintf(&header_version[JVM_IDENT_MAX-9], "%08x", hash); header_version[JVM_IDENT_MAX-1] = 0; // Null terminate. } + + assert(header_version[JVM_IDENT_MAX-1] == 0, "must be"); } FileMapInfo::FileMapInfo(bool is_static) { memset((void*)this, 0, sizeof(FileMapInfo)); _is_static = is_static;
*** 889,902 **** --- 893,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; + } + + unsigned int expected_magic = is_static ? CDS_ARCHIVE_MAGIC : CDS_DYNAMIC_ARCHIVE_MAGIC; + if (_header->_magic != expected_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->_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; + } + + if (_header->_jvm_ident[JVM_IDENT_MAX-1] != 0) { + FileMapInfo::fail_continue("JVM version identifier is corrupted."); + 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(cds)("_jvm_ident expected: %s", header_version); + log_info(cds)(" 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);
*** 907,920 **** return false; } _file_offset += n + _header->_base_archive_name_size; // accounts for the size of _base_archive_name if (is_static) { - if (_header->_magic != CDS_ARCHIVE_MAGIC) { - fail_continue("Incorrect static archive magic number"); - return false; - } // just checking the last region is sufficient since the archive is written // in sequential order size_t len = lseek(fd, 0, SEEK_END); CDSFileMapRegion* si = space_at(MetaspaceShared::last_valid_region); // The last space might be empty --- 960,969 ----
*** 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; --- 1797,1807 ----
< prev index next >