diff --git a/common/ffs.h b/common/ffs.h index b5e4979..c285db7 100644 --- a/common/ffs.h +++ b/common/ffs.h @@ -753,9 +753,11 @@ typedef struct CPD_EXT_SIGNED_PACKAGE_INFO_MODULE_ { UINT8 HashAlgorithm; UINT16 HashSize; UINT32 MetadataSize; - UINT8 MetadataHash[1]; // Can be 32 or 48 bit + // UINT8 MetadataHash[]; with the actual hash size is 32 or 48 bytes } CPD_EXT_SIGNED_PACKAGE_INFO_MODULE; +static const size_t CpdExtSignedPkgMetadataHashOffset = sizeof(CPD_EXT_SIGNED_PACKAGE_INFO_MODULE); + typedef struct CPD_EXT_SIGNED_PACKAGE_INFO_ { UINT32 ExtensionType; UINT32 ExtensionLength; @@ -774,9 +776,11 @@ typedef struct CPD_EXT_MODULE_ATTRIBUTES_ { UINT32 UncompressedSize; UINT32 CompressedSize; UINT32 GlobalModuleId; - UINT8 ImageHash[1]; // The actual hash size is 32 or 48 bytes + // UINT8 ImageHash[]; with the actual hash size is 32 or 48 bytes } CPD_EXT_MODULE_ATTRIBUTES; +static const size_t CpdExtModuleImageHashOffset = sizeof(CPD_EXT_MODULE_ATTRIBUTES); + #define CPD_EXT_MODULE_COMPRESSION_TYPE_UNCOMPRESSED 0 #define CPD_EXT_MODULE_COMPRESSION_TYPE_HUFFMAN 1 #define CPD_EXT_MODULE_COMPRESSION_TYPE_LZMA 2 diff --git a/common/ffsparser.cpp b/common/ffsparser.cpp index 749a3ac..9f5a2a4 100644 --- a/common/ffsparser.cpp +++ b/common/ffsparser.cpp @@ -5170,11 +5170,11 @@ USTATUS FfsParser::parseCpdExtensionsArea(const UModelIndex & index) // Parse Module Attributes a bit further else if (extHeader->Type == CPD_EXT_TYPE_MODULE_ATTRIBUTES) { const CPD_EXT_MODULE_ATTRIBUTES* attrHeader = (const CPD_EXT_MODULE_ATTRIBUTES*)partition.constData(); - int hashSize = partition.size() - offsetof(CPD_EXT_MODULE_ATTRIBUTES, ImageHash); + int hashSize = partition.size() - CpdExtModuleImageHashOffset; // This hash is stored reversed // Need to reverse it back to normal - UByteArray hash((const char*)&attrHeader->ImageHash, hashSize); + UByteArray hash((const char*)attrHeader + CpdExtModuleImageHashOffset, hashSize); std::reverse(hash.begin(), hash.end()); info = usprintf("Full size: %" PRIXQ "h (%" PRIuQ ")\nType: %Xh\n" @@ -5226,12 +5226,12 @@ USTATUS FfsParser::parseSignedPackageInfoData(const UModelIndex & index) const CPD_EXT_SIGNED_PACKAGE_INFO_MODULE* moduleHeader = (const CPD_EXT_SIGNED_PACKAGE_INFO_MODULE*)(body.constData() + offset); if (sizeof(CPD_EXT_SIGNED_PACKAGE_INFO_MODULE) <= ((UINT32)body.size() - offset)) { // TODO: check sanity of moduleHeader->HashSize - UByteArray module((const char*)moduleHeader, sizeof(CPD_EXT_SIGNED_PACKAGE_INFO_MODULE) - sizeof(moduleHeader->MetadataHash) + moduleHeader->HashSize); + UByteArray module((const char*)moduleHeader, CpdExtSignedPkgMetadataHashOffset + moduleHeader->HashSize); UString name = usprintf("%.12s", moduleHeader->Name); // This hash is stored reversed // Need to reverse it back to normal - UByteArray hash((const char*)&moduleHeader->MetadataHash, moduleHeader->HashSize); + UByteArray hash((const char*)moduleHeader + CpdExtSignedPkgMetadataHashOffset, moduleHeader->HashSize); std::reverse(hash.begin(), hash.end()); UString info = usprintf("Full size: %" PRIXQ "h (%" PRIuQ ")\nType: %Xh\nHash algorithm: %Xh\nHash size: %Xh (%u)\nMetadata size: %Xh (%u)\nMetadata hash: ",