sdm: Appropriate handling of buffer deallocation on valid fd.

Rotator controller does not allocate buffer for the rotator session on
display validate failures. Buffer fd of a rotator session can be
invalid for this scenario. Handle deallocation of the buffer only
on valid buffer fd.

Change-Id: Icb75cbe6fac1c931bc8dc0bd2fce2ac17719b5df
diff --git a/sdm/libs/hwc/hwc_buffer_allocator.cpp b/sdm/libs/hwc/hwc_buffer_allocator.cpp
index 2d79f0d..d0fdc8c 100644
--- a/sdm/libs/hwc/hwc_buffer_allocator.cpp
+++ b/sdm/libs/hwc/hwc_buffer_allocator.cpp
@@ -115,36 +115,35 @@
   int ret = 0;
 
   AllocatedBufferInfo *alloc_buffer_info = &buffer_info->alloc_buffer_info;
-  MetaBufferInfo *meta_buffer_info = static_cast<MetaBufferInfo *> (buffer_info->private_data);
-  if (alloc_buffer_info->fd < 0) {
-    DLOGE("Invalid parameters: fd %d", alloc_buffer_info->fd);
-    return kErrorParameters;
+
+  // Deallocate the buffer, only if the buffer fd is valid.
+  if (alloc_buffer_info->fd > 0) {
+    MetaBufferInfo *meta_buffer_info = static_cast<MetaBufferInfo *> (buffer_info->private_data);
+    gralloc::IMemAlloc *memalloc = alloc_controller_->getAllocator(meta_buffer_info->alloc_type);
+    if (memalloc == NULL) {
+      DLOGE("Memalloc handle is NULL, alloc type %d", meta_buffer_info->alloc_type);
+      return kErrorResources;
+    }
+
+    ret = memalloc->free_buffer(meta_buffer_info->base_addr, alloc_buffer_info->size, 0,
+                                alloc_buffer_info->fd);
+    if (ret != 0) {
+      DLOGE("Error freeing buffer base_addr %p size %d fd %d", meta_buffer_info->base_addr,
+            alloc_buffer_info->size, alloc_buffer_info->fd);
+      return kErrorMemory;
+    }
+
+    alloc_buffer_info->fd = -1;
+    alloc_buffer_info->stride = 0;
+    alloc_buffer_info->size = 0;
+
+    meta_buffer_info->base_addr = NULL;
+    meta_buffer_info->alloc_type = 0;
+
+    delete meta_buffer_info;
+    meta_buffer_info = NULL;
   }
 
-  gralloc::IMemAlloc *memalloc = alloc_controller_->getAllocator(meta_buffer_info->alloc_type);
-  if (memalloc == NULL) {
-    DLOGE("Memalloc handle is NULL, alloc type %d", meta_buffer_info->alloc_type);
-    return kErrorResources;
-  }
-
-  ret = memalloc->free_buffer(meta_buffer_info->base_addr, alloc_buffer_info->size, 0,
-                              alloc_buffer_info->fd);
-  if (ret != 0) {
-    DLOGE("Error freeing buffer base_addr %p size %d fd %d", meta_buffer_info->base_addr,
-          alloc_buffer_info->size, alloc_buffer_info->fd);
-    return kErrorMemory;
-  }
-
-  alloc_buffer_info->fd = -1;
-  alloc_buffer_info->stride = 0;
-  alloc_buffer_info->size = 0;
-
-  meta_buffer_info->base_addr = NULL;
-  meta_buffer_info->alloc_type = 0;
-
-  delete meta_buffer_info;
-  meta_buffer_info = NULL;
-
   return kErrorNone;
 }