camera: camera3_test: Replace freed buffer test by invalid handle test

Since accessing the memory pointed by a Free()'d buffer_handle_t is not
legal, remove the FreeBufferHandle test. Instead, add a
InvalidBufferHandle test that uses a handle pointing to a legal memory
of invalid content.

BUG=b:131195719
TEST=Pass Camera3FrameTest/Camera3InvalidBufferTest.*

Change-Id: Ie7b5e5547946bacbe26c71abc9a99843de31faa8
Reviewed-on: https://chromium-review.googlesource.com/1583566
Commit-Ready: Ren-Pei Zeng <kamesan@chromium.org>
Tested-by: Ren-Pei Zeng <kamesan@chromium.org>
Reviewed-by: Hung-yu Wu <hywu@chromium.org>
diff --git a/camera/camera3_test/camera3_frame_test.cc b/camera/camera3_test/camera3_frame_test.cc
index 7ba3d3b..ebc7ad4 100644
--- a/camera/camera3_test/camera3_frame_test.cc
+++ b/camera/camera3_test/camera3_frame_test.cc
@@ -1284,13 +1284,11 @@
   RunInvalidBufferTest(&handle);
 }
 
-TEST_P(Camera3InvalidBufferTest, FreedBufferHandle) {
-  BufferHandleUniquePtr buffer = Camera3TestGralloc::GetInstance()->Allocate(
-      default_width_, default_height_, HAL_PIXEL_FORMAT_YCbCr_420_888,
-      GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_HW_CAMERA_WRITE);
-  ASSERT_NE(nullptr, buffer);
-  buffer_handle_t handle = *buffer.get();
-  buffer.reset();
+TEST_P(Camera3InvalidBufferTest, InvalidBufferHandle) {
+  // Make an invalid buffer handle with a wrong magic number.
+  auto cbh = std::make_unique<camera_buffer_handle_t>();
+  cbh->magic = ~cbh->magic;
+  buffer_handle_t handle = reinterpret_cast<buffer_handle_t>(cbh.get());
   RunInvalidBufferTest(&handle);
 }
 
diff --git a/camera/common/camera_buffer_manager_impl.cc b/camera/common/camera_buffer_manager_impl.cc
index 62e14f0..98eef79 100644
--- a/camera/common/camera_buffer_manager_impl.cc
+++ b/camera/common/camera_buffer_manager_impl.cc
@@ -296,6 +296,9 @@
 
 int CameraBufferManagerImpl::Free(buffer_handle_t buffer) {
   auto handle = camera_buffer_handle_t::FromBufferHandle(buffer);
+  if (!handle) {
+    return -EINVAL;
+  }
 
   if (handle->type == GRALLOC) {
     Deregister(buffer);