| Index: extensions/common/crx_file.cc
|
| ===================================================================
|
| --- extensions/common/crx_file.cc (revision 201835)
|
| +++ extensions/common/crx_file.cc (working copy)
|
| @@ -11,6 +11,9 @@
|
| // 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 @@
|
|
|
| // 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 @@
|
| 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;
|
|
|