Fix bug in gralloc
authorRebecca Schultz Zavin <rebecca@android.com>
Thu, 4 Oct 2012 18:23:56 +0000 (11:23 -0700)
committerRebecca Schultz Zavin <rebecca@android.com>
Thu, 4 Oct 2012 18:25:26 +0000 (11:25 -0700)
If buffers were allocated and then locked without ever
being passed to another process lock would return NULL
instead of a pointer to the buffer.  Instead map the buffer
from lock if it hasn't already been done by register.  Also
check in free and unmap the buffer it is mapped.

Change-Id: I3fe670ccb429f3de5f2e4dd07768414e70a02036
Signed-off-by: Rebecca Schultz Zavin <rebecca@android.com>
gralloc/gralloc.cpp
gralloc/mapper.cpp

index cb4cb5bd799d8c6a88a99e3a3d005c141765b7be..e28c005d0134f03a885b50462124b2087c162b37 100644 (file)
@@ -356,6 +356,8 @@ static int gralloc_free(alloc_device_t* dev,
     private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
     gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
                                                                    dev->common.module);
+    if (hnd->base)
+        grallocUnmap(module, const_cast<private_handle_t*>(hnd));
 
     close(hnd->fd);
     if (hnd->fd1 >= 0)
index 0e7b8b93cac80672b1b803aa35d4eb8f20083637..e63f749d0754ed9802656ce90d325affca2744e4 100644 (file)
@@ -164,6 +164,8 @@ int gralloc_lock(gralloc_module_t const* module,
         return -EINVAL;
 
     private_handle_t* hnd = (private_handle_t*)handle;
+    if (!hnd->base)
+        gralloc_map(module, hnd);
     *vaddr = (void*)hnd->base;
     return 0;
 }