Ensure codeOffset and cachedCodeDataAddr aligned to pagesize.
diff --git a/bcc.cpp b/bcc.cpp
index 7b30334..eca3a07 100644
--- a/bcc.cpp
+++ b/bcc.cpp
@@ -2814,33 +2814,43 @@
LOGE("data (global variable) cache overflow\n");
goto bail;
}
+
+ long pagesize = sysconf(_SC_PAGESIZE);
+ if (mCacheHdr->codeOffset % pagesize != 0) {
+ LOGE("code offset must aligned to pagesize\n");
+ goto bail;
+ }
}
// Part 2. Deal with the codedata section
{
- void *addr = reinterpret_cast<char *>(mCacheHdr->cachedCodeDataAddr);
+ long pagesize = sysconf(_SC_PAGESIZE);
- // Try to mmap at cached address directly.
- mCodeDataAddr = (char *) mmap(addr, BCC_MMAP_IMG_SIZE,
- PROT_READ | PROT_EXEC | PROT_WRITE,
- MAP_PRIVATE | MAP_FIXED,
- mCacheFd, mCacheHdr->codeOffset);
+ if (mCacheHdr->cachedCodeDataAddr % pagesize == 0) {
+ void *addr = reinterpret_cast<char *>(mCacheHdr->cachedCodeDataAddr);
- if (mCodeDataAddr && mCodeDataAddr != MAP_FAILED) {
- // Cheers! Mapped at the cached address successfully.
+ // Try to mmap at cached address directly.
+ mCodeDataAddr = (char *) mmap(addr, BCC_MMAP_IMG_SIZE,
+ PROT_READ | PROT_EXEC | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED,
+ mCacheFd, mCacheHdr->codeOffset);
- if (mCacheHdr->cachedCodeDataAddr >= BCC_MMAP_IMG_BEGIN) {
- size_t offset = mCacheHdr->cachedCodeDataAddr - BCC_MMAP_IMG_BEGIN;
+ if (mCodeDataAddr && mCodeDataAddr != MAP_FAILED) {
+ // Cheers! Mapped at the cached address successfully.
- if ((offset % BCC_MMAP_IMG_SIZE) == 0 &&
- (offset / BCC_MMAP_IMG_SIZE) < BCC_MMAP_IMG_COUNT) {
- // Update the BccMmapImgAddrTaken table (if required)
- Compiler::BccMmapImgAddrTaken[offset / BCC_MMAP_IMG_SIZE] = true;
+ if (mCacheHdr->cachedCodeDataAddr >= BCC_MMAP_IMG_BEGIN) {
+ size_t offset = mCacheHdr->cachedCodeDataAddr - BCC_MMAP_IMG_BEGIN;
+
+ if ((offset % BCC_MMAP_IMG_SIZE) == 0 &&
+ (offset / BCC_MMAP_IMG_SIZE) < BCC_MMAP_IMG_COUNT) {
+ // Update the BccMmapImgAddrTaken table (if required)
+ Compiler::BccMmapImgAddrTaken[offset / BCC_MMAP_IMG_SIZE] = true;
+ }
}
- }
- flock(mCacheFd, LOCK_UN);
- return 0; // loadCacheFile succeed!
+ flock(mCacheFd, LOCK_UN);
+ return 0; // loadCacheFile succeed!
+ }
}
}