| 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";
|
|
|
| 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;
|
|
|