Sanity check IMemory access versus underlying mmap am: 94b0d4e3ab am: ef6908e2b3 am: 97f49e50de am: 84f488f354 am: ebdad60d6b
am: fc598c54d9
* commit 'fc598c54d945c48ade547a52a01e2e704df1618b':
Sanity check IMemory access versus underlying mmap
diff --git a/Parcel.cpp b/Parcel.cpp
index 7a4ddc4..22d7ef3 100644
--- a/Parcel.cpp
+++ b/Parcel.cpp
@@ -96,7 +96,7 @@
};
void acquire_object(const sp<ProcessState>& proc,
- const flat_binder_object& obj, const void* who)
+ const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
{
switch (obj.type) {
case BINDER_TYPE_BINDER:
@@ -123,8 +123,15 @@
return;
}
case BINDER_TYPE_FD: {
- // intentionally blank -- nothing to do to acquire this, but we do
- // recognize it as a legitimate object type.
+ if (obj.cookie != 0) {
+ if (outAshmemSize != NULL) {
+ // If we own an ashmem fd, keep track of how much memory it refers to.
+ int size = ashmem_get_size_region(obj.handle);
+ if (size > 0) {
+ *outAshmemSize += size;
+ }
+ }
+ }
return;
}
}
@@ -132,9 +139,15 @@
ALOGD("Invalid object type 0x%08x", obj.type);
}
-void release_object(const sp<ProcessState>& proc,
+void acquire_object(const sp<ProcessState>& proc,
const flat_binder_object& obj, const void* who)
{
+ acquire_object(proc, obj, who, NULL);
+}
+
+static void release_object(const sp<ProcessState>& proc,
+ const flat_binder_object& obj, const void* who, size_t* outAshmemSize)
+{
switch (obj.type) {
case BINDER_TYPE_BINDER:
if (obj.binder) {
@@ -160,7 +173,16 @@
return;
}
case BINDER_TYPE_FD: {
- if (obj.cookie != 0) close(obj.handle);
+ if (outAshmemSize != NULL) {
+ if (obj.cookie != 0) {
+ int size = ashmem_get_size_region(obj.handle);
+ if (size > 0) {
+ *outAshmemSize -= size;
+ }
+
+ close(obj.handle);
+ }
+ }
return;
}
}
@@ -168,6 +190,12 @@
ALOGE("Invalid object type 0x%08x", obj.type);
}
+void release_object(const sp<ProcessState>& proc,
+ const flat_binder_object& obj, const void* who)
+{
+ release_object(proc, obj, who, NULL);
+}
+
inline static status_t finish_flatten_binder(
const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out)
{
@@ -504,7 +532,7 @@
flat_binder_object* flat
= reinterpret_cast<flat_binder_object*>(mData + off);
- acquire_object(proc, *flat, this);
+ acquire_object(proc, *flat, this, &mOpenAshmemSize);
if (flat->type == BINDER_TYPE_FD) {
// If this is a file descriptor, we need to dup it so the
@@ -923,8 +951,6 @@
int fd = ashmem_create_region("Parcel Blob", len);
if (fd < 0) return NO_MEMORY;
- mBlobAshmemSize += len;
-
int result = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE);
if (result < 0) {
status = result;
@@ -1026,7 +1052,7 @@
// Need to write meta-data?
if (nullMetaData || val.binder != 0) {
mObjects[mObjectsSize] = mDataPos;
- acquire_object(ProcessState::self(), val, this);
+ acquire_object(ProcessState::self(), val, this, &mOpenAshmemSize);
mObjectsSize++;
}
@@ -1609,7 +1635,7 @@
i--;
const flat_binder_object* flat
= reinterpret_cast<flat_binder_object*>(data+objects[i]);
- release_object(proc, *flat, this);
+ release_object(proc, *flat, this, &mOpenAshmemSize);
}
}
@@ -1623,7 +1649,7 @@
i--;
const flat_binder_object* flat
= reinterpret_cast<flat_binder_object*>(data+objects[i]);
- acquire_object(proc, *flat, this);
+ acquire_object(proc, *flat, this, &mOpenAshmemSize);
}
}
@@ -1805,7 +1831,7 @@
// will need to rescan because we may have lopped off the only FDs
mFdsKnown = false;
}
- release_object(proc, *flat, this);
+ release_object(proc, *flat, this, &mOpenAshmemSize);
}
binder_size_t* objects =
(binder_size_t*)realloc(mObjects, objectsSize*sizeof(binder_size_t));
@@ -1890,7 +1916,7 @@
mFdsKnown = true;
mAllowFds = true;
mOwner = NULL;
- mBlobAshmemSize = 0;
+ mOpenAshmemSize = 0;
}
void Parcel::scanForFds() const
@@ -1910,7 +1936,15 @@
size_t Parcel::getBlobAshmemSize() const
{
- return mBlobAshmemSize;
+ // This used to return the size of all blobs that were written to ashmem, now we're returning
+ // the ashmem currently referenced by this Parcel, which should be equivalent.
+ // TODO: Remove method once ABI can be changed.
+ return mOpenAshmemSize;
+}
+
+size_t Parcel::getOpenAshmemSize() const
+{
+ return mOpenAshmemSize;
}
// --- Parcel::Blob ---
diff --git a/include/hwbinder/Parcel.h b/include/hwbinder/Parcel.h
index 3ada1e9..16cd6cf 100644
--- a/include/hwbinder/Parcel.h
+++ b/include/hwbinder/Parcel.h
@@ -341,10 +341,12 @@
};
private:
- size_t mBlobAshmemSize;
+ size_t mOpenAshmemSize;
public:
+ // TODO: Remove once ABI can be changed.
size_t getBlobAshmemSize() const;
+ size_t getOpenAshmemSize() const;
};
// ---------------------------------------------------------------------------