Merge "Adding a build id check to blob cache." into mnc-dev
This commit is contained in:
commit
338142aa81
3 changed files with 23 additions and 7 deletions
|
|
@ -185,6 +185,12 @@ private:
|
|||
// mNumEntries is number of cache entries following the header in the
|
||||
// data.
|
||||
size_t mNumEntries;
|
||||
|
||||
// mBuildId is the build id of the device when the cache was created.
|
||||
// When an update to the build happens (via an OTA or other update) this
|
||||
// is used to invalidate the cache.
|
||||
int mBuildIdLength;
|
||||
char mBuildId[];
|
||||
};
|
||||
|
||||
// An EntryHeader is the header for a serialized cache entry. No need to
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ LOCAL_PATH:= $(call my-dir)
|
|||
|
||||
commonSources:= \
|
||||
BasicHashtable.cpp \
|
||||
BlobCache.cpp \
|
||||
CallStack.cpp \
|
||||
FileMap.cpp \
|
||||
JenkinsHash.cpp \
|
||||
|
|
@ -74,6 +73,7 @@ include $(CLEAR_VARS)
|
|||
# we have the common sources, plus some device-specific stuff
|
||||
LOCAL_SRC_FILES:= \
|
||||
$(commonSources) \
|
||||
BlobCache.cpp \
|
||||
Looper.cpp \
|
||||
Trace.cpp
|
||||
|
||||
|
|
@ -83,7 +83,8 @@ endif
|
|||
LOCAL_CFLAGS += -Werror
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := \
|
||||
libcutils
|
||||
libcutils \
|
||||
libc
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libbacktrace \
|
||||
|
|
|
|||
|
|
@ -25,13 +25,15 @@
|
|||
#include <utils/Errors.h>
|
||||
#include <utils/Log.h>
|
||||
|
||||
#include <cutils/properties.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
// BlobCache::Header::mMagicNumber value
|
||||
static const uint32_t blobCacheMagic = ('_' << 24) + ('B' << 16) + ('b' << 8) + '$';
|
||||
|
||||
// BlobCache::Header::mBlobCacheVersion value
|
||||
static const uint32_t blobCacheVersion = 2;
|
||||
static const uint32_t blobCacheVersion = 3;
|
||||
|
||||
// BlobCache::Header::mDeviceVersion value
|
||||
static const uint32_t blobCacheDeviceVersion = 1;
|
||||
|
|
@ -165,7 +167,7 @@ static inline size_t align4(size_t size) {
|
|||
}
|
||||
|
||||
size_t BlobCache::getFlattenedSize() const {
|
||||
size_t size = align4(sizeof(Header));
|
||||
size_t size = align4(sizeof(Header) + PROPERTY_VALUE_MAX);
|
||||
for (size_t i = 0; i < mCacheEntries.size(); i++) {
|
||||
const CacheEntry& e(mCacheEntries[i]);
|
||||
sp<Blob> keyBlob = e.getKey();
|
||||
|
|
@ -187,10 +189,13 @@ status_t BlobCache::flatten(void* buffer, size_t size) const {
|
|||
header->mBlobCacheVersion = blobCacheVersion;
|
||||
header->mDeviceVersion = blobCacheDeviceVersion;
|
||||
header->mNumEntries = mCacheEntries.size();
|
||||
char buildId[PROPERTY_VALUE_MAX];
|
||||
header->mBuildIdLength = property_get("ro.build.id", buildId, "");
|
||||
memcpy(header->mBuildId, buildId, header->mBuildIdLength);
|
||||
|
||||
// Write cache entries
|
||||
uint8_t* byteBuffer = reinterpret_cast<uint8_t*>(buffer);
|
||||
off_t byteOffset = align4(sizeof(Header));
|
||||
off_t byteOffset = align4(sizeof(Header) + header->mBuildIdLength);
|
||||
for (size_t i = 0; i < mCacheEntries.size(); i++) {
|
||||
const CacheEntry& e(mCacheEntries[i]);
|
||||
sp<Blob> keyBlob = e.getKey();
|
||||
|
|
@ -239,15 +244,19 @@ status_t BlobCache::unflatten(void const* buffer, size_t size) {
|
|||
ALOGE("unflatten: bad magic number: %" PRIu32, header->mMagicNumber);
|
||||
return BAD_VALUE;
|
||||
}
|
||||
char buildId[PROPERTY_VALUE_MAX];
|
||||
int len = property_get("ro.build.id", buildId, "");
|
||||
if (header->mBlobCacheVersion != blobCacheVersion ||
|
||||
header->mDeviceVersion != blobCacheDeviceVersion) {
|
||||
header->mDeviceVersion != blobCacheDeviceVersion ||
|
||||
len != header->mBuildIdLength ||
|
||||
strncmp(buildId, header->mBuildId, len)) {
|
||||
// We treat version mismatches as an empty cache.
|
||||
return OK;
|
||||
}
|
||||
|
||||
// Read cache entries
|
||||
const uint8_t* byteBuffer = reinterpret_cast<const uint8_t*>(buffer);
|
||||
off_t byteOffset = align4(sizeof(Header));
|
||||
off_t byteOffset = align4(sizeof(Header) + header->mBuildIdLength);
|
||||
size_t numEntries = header->mNumEntries;
|
||||
for (size_t i = 0; i < numEntries; i++) {
|
||||
if (byteOffset + sizeof(EntryHeader) > size) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue