summaryrefslogtreecommitdiffstats
path: root/modules/gralloc/gralloc.cpp
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-07-07 17:53:43 -0700
committerMathias Agopian <mathias@google.com>2009-07-07 17:53:43 -0700
commitbd80b38f2945ac918f66fb336c149b28b9dd030e (patch)
treede39a66516d8503e266ade1b98f3326188c4fb95 /modules/gralloc/gralloc.cpp
parent440d4e4741a2641173b44bd9b810c9a4960206c2 (diff)
downloadhardware_libhardware-bd80b38f2945ac918f66fb336c149b28b9dd030e.zip
hardware_libhardware-bd80b38f2945ac918f66fb336c149b28b9dd030e.tar.gz
hardware_libhardware-bd80b38f2945ac918f66fb336c149b28b9dd030e.tar.bz2
more fixes for [1965730]. We now free (unmap) both ashmem and pmem regions.
Diffstat (limited to 'modules/gralloc/gralloc.cpp')
-rw-r--r--modules/gralloc/gralloc.cpp40
1 files changed, 19 insertions, 21 deletions
diff --git a/modules/gralloc/gralloc.cpp b/modules/gralloc/gralloc.cpp
index a01a95c..8c496dc 100644
--- a/modules/gralloc/gralloc.cpp
+++ b/modules/gralloc/gralloc.cpp
@@ -389,38 +389,36 @@ static int gralloc_free(alloc_device_t* dev,
return -EINVAL;
private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
- if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)
- {
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) {
// free this buffer
private_module_t* m = reinterpret_cast<private_module_t*>(
dev->common.module);
const size_t bufferSize = m->finfo.line_length * m->info.yres;
int index = (hnd->base - m->framebuffer->base) / bufferSize;
m->bufferMask &= ~(1<<index);
- }
+ } else {
#if HAVE_ANDROID_OS
- else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_PMEM)
- {
- if (hnd->fd >= 0) {
- struct pmem_region sub = { hnd->offset, hnd->size };
- int err = ioctl(hnd->fd, PMEM_UNMAP, &sub);
- LOGE_IF(err<0, "PMEM_UNMAP failed (%s), "
- "fd=%d, sub.offset=%lu, sub.size=%lu",
- strerror(errno), hnd->fd, hnd->offset, hnd->size);
- if (err == 0) {
- // we can't deallocate the memory in case of UNMAP failure
- // because it would give that process access to someone else's
- // surfaces, which would be a security breach.
- sAllocator.deallocate(hnd->offset);
+ if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_PMEM) {
+ if (hnd->fd >= 0) {
+ struct pmem_region sub = { hnd->offset, hnd->size };
+ int err = ioctl(hnd->fd, PMEM_UNMAP, &sub);
+ LOGE_IF(err<0, "PMEM_UNMAP failed (%s), "
+ "fd=%d, sub.offset=%lu, sub.size=%lu",
+ strerror(errno), hnd->fd, hnd->offset, hnd->size);
+ if (err == 0) {
+ // we can't deallocate the memory in case of UNMAP failure
+ // because it would give that process access to someone else's
+ // surfaces, which would be a security breach.
+ sAllocator.deallocate(hnd->offset);
+ }
}
}
- }
#endif // HAVE_ANDROID_OS
+ gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
+ dev->common.module);
+ terminateBuffer(module, const_cast<private_handle_t*>(hnd));
+ }
- gralloc_module_t* m = reinterpret_cast<gralloc_module_t*>(
- dev->common.module);
- gralloc_unregister_buffer(m, handle);
-
close(hnd->fd);
delete hnd;
return 0;