diff --git a/libpandafile/file.cpp b/libpandafile/file.cpp index 7603594a515705264907f294ef889a422cabbe9b..a428513991030bd80673711f0c041445b5a4f170 100644 --- a/libpandafile/file.cpp +++ b/libpandafile/file.cpp @@ -553,24 +553,7 @@ bool CheckHeader(const os::mem::ConstBytePtr &ptr, const std::string_view &filen return false; } - auto file_version = header->version; - // skip isa version check for version number of 10.0.0.0 temporarily - constexpr std::array tempVersion = {10, 0, 0, 0}; - if ((file_version < minVersion || file_version > version) && !(file_version == tempVersion)) { - LOG(ERROR, PANDAFILE) << "Unable to open file '" << filename << "' with bytecode version " - << VersionToString(file_version); - if (file_version < minVersion) { - LOG(ERROR, PANDAFILE) << "Minimum supported abc file version on the current system image is " - << VersionToString(minVersion) - << "Please upgrade the sdk tools to generate supported version of abc files \ - or execute the abc file on former version of system image"; - } else { - LOG(ERROR, PANDAFILE) << "Maximum supported abc file version on the current system image is " - << VersionToString(version) - << "Please upgrade the system image or use former version of SDK tools to generate abc files"; - } - return false; - } + CheckFileVersion(header->version, filename); if (header->file_size < sizeof(File::Header) || header->file_size > ptr.GetSize()) { LOG(ERROR, PANDAFILE) << "Invalid panda file size " << header->file_size; @@ -611,6 +594,32 @@ bool CheckHeader(const os::mem::ConstBytePtr &ptr, const std::string_view &filen return true; } +void CheckFileVersion(const std::array &file_version, const std::string_view &filename) +{ + // 11.0.1.0 and 11.0.0.0 is not compatible with each other + constexpr std::array incompatibleSdkVersion = {11, 0, 0, 0}; + constexpr std::array incompatibleSystemImageVersion = {11, 0, 1, 0}; + if (file_version < minVersion) { + LOG(FATAL, PANDAFILE) << "Unable to open file '" << filename << "' with abc file version " + << VersionToString(file_version) + << ". Minimum supported abc file version on the current system image is " << VersionToString(minVersion) + << ". Please upgrade the sdk tools to generate supported version of abc files " + << "or execute the abc file on former version of system image"; + } else if (file_version > version) { + LOG(FATAL, PANDAFILE) << "Unable to open file '" << filename << "' with abc file version " + << VersionToString(file_version) + << ". Maximum supported abc file version on the current system image is " << VersionToString(version) + << ". Please upgrade the system image or use former version of SDK tools to generate abc files"; + } else if (file_version == incompatibleSdkVersion && version == incompatibleSystemImageVersion) { + LOG(FATAL, PANDAFILE) << "Unable to open file '" << filename << "' with abc file version " + << VersionToString(file_version) << ". Current system image version is " + << VersionToString(version) << ", while abc file version is " << VersionToString(file_version) + << ". The version "<< VersionToString(file_version) + << " is not a compatible version, can't run on system image of version " << VersionToString(version) + << ". Please use sdk tools and system image in pairs " + << "and make the version of sdk tools and system image consistent"; + } +} /* static */ std::unique_ptr File::OpenFromMemory(os::mem::ConstBytePtr &&ptr) { diff --git a/libpandafile/file.h b/libpandafile/file.h index c31f555d5c84258a2f8f4839713728e252900546..e613d35d686f87a82e1f41e6bfed963c4e1e3b63 100644 --- a/libpandafile/file.h +++ b/libpandafile/file.h @@ -494,6 +494,7 @@ std::unique_ptr OpenPandaFile(std::string_view location, std::string * Check ptr point valid panda file: magic */ bool CheckHeader(const os::mem::ConstBytePtr &ptr, const std::string_view &filename = ""); +void CheckFileVersion(const std::array &file_version, const std::string_view &filename); // NOLINTNEXTLINE(readability-identifier-naming) extern const char *ARCHIVE_FILENAME; diff --git a/libpandafile/tests/file_item_container_test.cpp b/libpandafile/tests/file_item_container_test.cpp index b4359cb85d3b59f922031fec28c295db9cad6cb4..a3dd0cb376293b94e483e56d59e5e4d476e2f171 100644 --- a/libpandafile/tests/file_item_container_test.cpp +++ b/libpandafile/tests/file_item_container_test.cpp @@ -93,7 +93,7 @@ HWTEST(ItemContainer, TestFileOpen, testing::ext::TestSize.Level0) EXPECT_NE(File::Open(file_name), nullptr); } -HWTEST(ItemContainer, TestFileFormatVersionTooOld, testing::ext::TestSize.Level0) +HWTEST(ItemContainer, TestFileFormatVersionTooOldDeathTest, testing::ext::TestSize.Level0) { const std::string file_name = "test_file_format_version_too_old.abc"; { @@ -119,7 +119,7 @@ HWTEST(ItemContainer, TestFileFormatVersionTooOld, testing::ext::TestSize.Level0 EXPECT_TRUE(writer.FinishWrite()); } - EXPECT_EQ(File::Open(file_name), nullptr); + EXPECT_DEATH(File::Open(file_name), ".*"); } HWTEST(ItemContainer, TestRewriteChecksum, testing::ext::TestSize.Level0) @@ -163,7 +163,7 @@ HWTEST(ItemContainer, TestReserveBufferCapacity, testing::ext::TestSize.Level0) } } -HWTEST(ItemContainer, TestFileFormatVersionTooNew, testing::ext::TestSize.Level0) +HWTEST(ItemContainer, TestFileFormatVersionTooNewDeathTest, testing::ext::TestSize.Level0) { const std::string file_name = "test_file_format_version_too_new.abc"; { @@ -191,7 +191,7 @@ HWTEST(ItemContainer, TestFileFormatVersionTooNew, testing::ext::TestSize.Level0 EXPECT_TRUE(writer.FinishWrite()); } - EXPECT_EQ(File::Open(file_name), nullptr); + EXPECT_DEATH(File::Open(file_name), ".*"); } HWTEST(ItemContainer, TestFileFormatVersionValid, testing::ext::TestSize.Level0)