Network Cache: Use SHA1 for header checksum
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Jun 2015 17:43:31 +0000 (17:43 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Jun 2015 17:43:31 +0000 (17:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=145928

Reviewed by Chris Dumez.

Use SHA1 everywhere for consistency and robustness.

* NetworkProcess/cache/NetworkCacheStorage.cpp:
(WebKit::NetworkCache::Storage::bodyPathForKey):
(WebKit::NetworkCache::RecordMetaData::RecordMetaData):
(WebKit::NetworkCache::decodeRecordMetaData):
(WebKit::NetworkCache::decodeRecordHeader):
(WebKit::NetworkCache::encodeRecordMetaData):
(WebKit::NetworkCache::Storage::encodeRecord):
(WebKit::NetworkCache::hashData): Deleted.

    This was the last user of 32 bit hashes in cache code.

* NetworkProcess/cache/NetworkCacheStorage.h:

    Also bump the cache version number as recent changes have changed the format.
    Old caches would transition fine but this makes it easier to identify which version user has.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@185513 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp
Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h

index ff5d619..5bff398 100644 (file)
@@ -1,3 +1,28 @@
+2015-06-12  Antti Koivisto  <antti@apple.com>
+
+        Network Cache: Use SHA1 for header checksum
+        https://bugs.webkit.org/show_bug.cgi?id=145928
+
+        Reviewed by Chris Dumez.
+
+        Use SHA1 everywhere for consistency and robustness.
+
+        * NetworkProcess/cache/NetworkCacheStorage.cpp:
+        (WebKit::NetworkCache::Storage::bodyPathForKey):
+        (WebKit::NetworkCache::RecordMetaData::RecordMetaData):
+        (WebKit::NetworkCache::decodeRecordMetaData):
+        (WebKit::NetworkCache::decodeRecordHeader):
+        (WebKit::NetworkCache::encodeRecordMetaData):
+        (WebKit::NetworkCache::Storage::encodeRecord):
+        (WebKit::NetworkCache::hashData): Deleted.
+
+            This was the last user of 32 bit hashes in cache code.
+
+        * NetworkProcess/cache/NetworkCacheStorage.h:
+
+            Also bump the cache version number as recent changes have changed the format.
+            Old caches would transition fine but this makes it easier to identify which version user has.
+
 2015-06-12  Simon Fraser  <simon.fraser@apple.com>
 
         [iOS WK2] Video with reflection crashes WebKit and Safari
index df1b9e7..4c8c0bf 100644 (file)
@@ -32,7 +32,6 @@
 #include "NetworkCacheCoders.h"
 #include "NetworkCacheFileSystem.h"
 #include "NetworkCacheIOChannel.h"
-#include <wtf/PageBlock.h>
 #include <wtf/RandomNumber.h>
 #include <wtf/RunLoop.h>
 #include <wtf/text/CString.h>
@@ -272,16 +271,6 @@ String Storage::bodyPathForKey(const Key& key) const
     return bodyPathForRecordPath(recordPathForKey(key));
 }
 
-static unsigned hashData(const Data& data)
-{
-    StringHasher hasher;
-    data.apply([&hasher](const uint8_t* data, size_t size) {
-        hasher.addCharacters(data, size);
-        return true;
-    });
-    return hasher.hash();
-}
-
 struct RecordMetaData {
     RecordMetaData() { }
     explicit RecordMetaData(const Key& key)
@@ -293,12 +282,14 @@ struct RecordMetaData {
     Key key;
     // FIXME: Add encoder/decoder for time_point.
     std::chrono::milliseconds epochRelativeTimeStamp;
-    unsigned headerChecksum;
-    uint64_t headerOffset;
+    SHA1::Digest headerHash;
     uint64_t headerSize;
     SHA1::Digest bodyHash;
     uint64_t bodySize;
     bool isBodyInline;
+
+    // Not encoded as a field. Header starts immediately after meta data.
+    uint64_t headerOffset;
 };
 
 static bool decodeRecordMetaData(RecordMetaData& metaData, const Data& fileData)
@@ -312,7 +303,7 @@ static bool decodeRecordMetaData(RecordMetaData& metaData, const Data& fileData)
             return false;
         if (!decoder.decode(metaData.epochRelativeTimeStamp))
             return false;
-        if (!decoder.decode(metaData.headerChecksum))
+        if (!decoder.decode(metaData.headerHash))
             return false;
         if (!decoder.decode(metaData.headerSize))
             return false;
@@ -344,7 +335,7 @@ static bool decodeRecordHeader(const Data& fileData, RecordMetaData& metaData, D
     }
 
     headerData = fileData.subrange(metaData.headerOffset, metaData.headerSize);
-    if (metaData.headerChecksum != hashData(headerData)) {
+    if (metaData.headerHash != computeSHA1(headerData)) {
         LOG(NetworkCacheStorage, "(NetworkProcess) header checksum mismatch");
         return false;
     }
@@ -394,7 +385,7 @@ static Data encodeRecordMetaData(const RecordMetaData& metaData)
     encoder << metaData.cacheStorageVersion;
     encoder << metaData.key;
     encoder << metaData.epochRelativeTimeStamp;
-    encoder << metaData.headerChecksum;
+    encoder << metaData.headerHash;
     encoder << metaData.headerSize;
     encoder << metaData.bodyHash;
     encoder << metaData.bodySize;
@@ -436,7 +427,7 @@ Data Storage::encodeRecord(const Record& record, Optional<BlobStorage::Blob> blo
 
     RecordMetaData metaData(record.key);
     metaData.epochRelativeTimeStamp = std::chrono::duration_cast<std::chrono::milliseconds>(record.timeStamp.time_since_epoch());
-    metaData.headerChecksum = hashData(record.header);
+    metaData.headerHash = computeSHA1(record.header);
     metaData.headerSize = record.header.size();
     metaData.bodyHash = blob ? blob.value().hash : computeSHA1(record.body);
     metaData.bodySize = record.body.size();
index 5e3aa4b..e3cc43c 100644 (file)
@@ -84,7 +84,7 @@ public:
     size_t capacity() const { return m_capacity; }
     size_t approximateSize() const;
 
-    static const unsigned version = 3;
+    static const unsigned version = 4;
 
     String basePath() const;
     String versionPath() const;