Merge "Adding a build id check to blob cache." into mnc-dev

This commit is contained in:
Michael Lentine 2015-05-27 17:39:22 +00:00 committed by Android (Google) Code Review
commit 338142aa81
3 changed files with 23 additions and 7 deletions

View file

@ -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

View file

@ -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 \

View file

@ -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) {