+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
#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>
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)
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)
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;
}
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;
}
encoder << metaData.cacheStorageVersion;
encoder << metaData.key;
encoder << metaData.epochRelativeTimeStamp;
- encoder << metaData.headerChecksum;
+ encoder << metaData.headerHash;
encoder << metaData.headerSize;
encoder << metaData.bodyHash;
encoder << metaData.bodySize;
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();