Chromium Code Reviews| Index: extensions/common/crx_file.cc |
| diff --git a/extensions/common/crx_file.cc b/extensions/common/crx_file.cc |
| index 4f50962a5df65be3b789f4d95ac1dc0c2265e0f5..73e7f7b73d6b778f6f59286882726aa005ebf38b 100644 |
| --- a/extensions/common/crx_file.cc |
| +++ b/extensions/common/crx_file.cc |
| @@ -11,6 +11,9 @@ namespace { |
| // The current version of the crx format. |
| static const uint32 kCurrentVersion = 2; |
| +// The current version of the crx diff format. |
| +static const uint32 kCurrentDiffVersion = 0; |
| + |
| // The maximum size the crx parser will tolerate for a public key. |
| static const uint32 kMaxPublicKeySize = 1 << 16; |
| @@ -21,6 +24,7 @@ static const uint32 kMaxSignatureSize = 1 << 16; |
| // The magic string embedded in the header. |
| const char kCrxFileHeaderMagic[] = "Cr24"; |
| +const char kCrxDiffFileHeaderMagic[] = "CrOD"; |
|
cpu_(ooo_6.6-7.5)
2013/06/14 23:05:49
in what ways is the differential crx different fro
waffles
2013/06/15 00:01:37
There are two major format differences:
1. CrOD in
|
| scoped_ptr<CrxFile> CrxFile::Parse(const CrxFile::Header& header, |
| CrxFile::Error* error) { |
| @@ -45,12 +49,21 @@ scoped_ptr<CrxFile> CrxFile::Create(const uint32 key_size, |
| CrxFile::CrxFile(const Header& header) : header_(header) { |
| } |
| +bool CrxFile::HeaderIsDelta(const CrxFile::Header& header) { |
| + return !strncmp(kCrxDiffFileHeaderMagic, header.magic, sizeof(header.magic)); |
| +} |
| + |
| bool CrxFile::HeaderIsValid(const CrxFile::Header& header, |
| CrxFile::Error* error) { |
| bool valid = false; |
| - if (strncmp(kCrxFileHeaderMagic, header.magic, sizeof(header.magic))) |
| + bool diffCrx = false; |
| + if (!strncmp(kCrxDiffFileHeaderMagic, header.magic, sizeof(header.magic))) |
| + diffCrx = true; |
| + if (strncmp(kCrxFileHeaderMagic, header.magic, sizeof(header.magic)) && |
| + !diffCrx) |
| *error = kWrongMagic; |
| - else if (header.version != kCurrentVersion) |
| + else if (header.version != kCurrentVersion |
| + && !(diffCrx && header.version == kCurrentDiffVersion)) |
| *error = kInvalidVersion; |
| else if (header.key_size > kMaxPublicKeySize) |
| *error = kInvalidKeyTooLarge; |