gralloc960: make fbdev fd a shallow copy

We never free private_module_t::framebuffer once it is initialized.
We can use a shallow copy of the fbdev fd.

Bug: 62222821
Test: boots
Change-Id: Id35641fa183993ce36a3c0ec7b7f4121bfdf36c4
diff --git a/gralloc960/alloc_device.cpp b/gralloc960/alloc_device.cpp
index 8614ae5..9a3ff8c 100644
--- a/gralloc960/alloc_device.cpp
+++ b/gralloc960/alloc_device.cpp
@@ -117,7 +117,7 @@
 
 	// The entire framebuffer memory is already mapped, now create a buffer object for parts of this memory
 	private_handle_t* hnd = new private_handle_t(private_handle_t::PRIV_FLAGS_FRAMEBUFFER, usage, size,
-			(void*)framebufferVaddr, 0, dup(m->framebuffer->fd),
+			(void*)framebufferVaddr, 0, m->framebuffer->shallow_fbdev_fd,
 			(framebufferVaddr - (uintptr_t)m->framebuffer->base));
 
 	/*
@@ -1234,7 +1234,6 @@
 		const size_t bufferSize = m->finfo.line_length * m->info.yres;
 		int index = ((uintptr_t)hnd->base - (uintptr_t)m->framebuffer->base) / bufferSize;
 		m->bufferMask &= ~(1 << index);
-		close(hnd->fd);
 	}
 
 	gralloc_buffer_attr_free( (private_handle_t *) hnd );
diff --git a/gralloc960/alloc_ion.cpp b/gralloc960/alloc_ion.cpp
index 2f9efc0..954c538 100644
--- a/gralloc960/alloc_ion.cpp
+++ b/gralloc960/alloc_ion.cpp
@@ -307,7 +307,7 @@
 {
 	struct fb_dmabuf_export fb_dma_buf;
 	int res;
-	res = ioctl( m->framebuffer->fd, FBIOGET_DMABUF, &fb_dma_buf );
+	res = ioctl( m->framebuffer->shallow_fbdev_fd, FBIOGET_DMABUF, &fb_dma_buf );
 	if(res == 0)
 	{
 		hnd->share_fd = fb_dma_buf.fd;
diff --git a/gralloc960/framebuffer_device.cpp b/gralloc960/framebuffer_device.cpp
index 873b5f4..fa60eb5 100644
--- a/gralloc960/framebuffer_device.cpp
+++ b/gralloc960/framebuffer_device.cpp
@@ -92,24 +92,25 @@
 		m->info.activate = FB_ACTIVATE_VBL;
 		m->info.yoffset = offset / m->finfo.line_length;
 
+                int fbdev_fd = m->framebuffer->shallow_fbdev_fd;
 #ifdef STANDARD_LINUX_SCREEN
-		if (ioctl(m->framebuffer->fd, FBIOPAN_DISPLAY, &m->info) == -1) 
+		if (ioctl(fbdev_fd, FBIOPAN_DISPLAY, &m->info) == -1) 
 		{
-			AERR( "FBIOPAN_DISPLAY failed for fd: %d", m->framebuffer->fd );
+			AERR( "FBIOPAN_DISPLAY failed for fd: %d", fbdev_fd );
 			m->base.unlock(&m->base, buffer); 
 			return -errno;
 		}
 #else /*Standard Android way*/
-		if (ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info) == -1) 
+		if (ioctl(fbdev_fd, FBIOPUT_VSCREENINFO, &m->info) == -1) 
 		{
-			AERR( "FBIOPUT_VSCREENINFO failed for fd: %d", m->framebuffer->fd );
+			AERR( "FBIOPUT_VSCREENINFO failed for fd: %d", fbdev_fd );
 			m->base.unlock(&m->base, buffer); 
 			return -errno;
 		}
 #endif
 		if ( 0 != gralloc_wait_for_vsync(dev) )
 		{
-			AERR( "Gralloc wait for vsync failed for fd: %d", m->framebuffer->fd );
+			AERR( "Gralloc wait for vsync failed for fd: %d", fbdev_fd );
 			m->base.unlock(&m->base, buffer); 
 			return -errno;
 		}
@@ -365,7 +366,7 @@
 
 	// Create a "fake" buffer object for the entire frame buffer memory, and store it in the module
 	module->framebuffer = new private_handle_t(private_handle_t::PRIV_FLAGS_FRAMEBUFFER, GRALLOC_USAGE_HW_FB, fbSize, vaddr,
-	                                           0, dup(fd), 0);
+	                                           0, fd, 0);
 
 	module->numBuffers = info.yres_virtual / info.yres;
 	module->bufferMask = 0;
diff --git a/gralloc960/gralloc_priv.h b/gralloc960/gralloc_priv.h
index a945354..51089dd 100644
--- a/gralloc960/gralloc_priv.h
+++ b/gralloc960/gralloc_priv.h
@@ -194,7 +194,7 @@
 	mali_gralloc_yuv_info yuv_info;
 
 	// Following members is for framebuffer only
-	int   fd;
+	int   shallow_fbdev_fd; // shallow copy, not dup'ed
 	union {
 		off_t    offset;
 		uint64_t padding4;
@@ -235,7 +235,7 @@
 		pid(getpid()),
 		attr_base(MAP_FAILED),
 		yuv_info(MALI_YUV_NO_INFO),
-		fd(fb_file),
+		shallow_fbdev_fd(fb_file),
 		offset(fb_offset)
 	{
 		version = sizeof(native_handle);
diff --git a/gralloc960/gralloc_vsync_default.cpp b/gralloc960/gralloc_vsync_default.cpp
index 40f6699..3ce7f0e 100644
--- a/gralloc960/gralloc_vsync_default.cpp
+++ b/gralloc960/gralloc_vsync_default.cpp
@@ -49,7 +49,7 @@
 	{
 		int crtc = 0;
 		gralloc_mali_vsync_report(MALI_VSYNC_EVENT_BEGIN_WAIT);
-		if(ioctl(m->framebuffer->fd, FBIO_WAITFORVSYNC, &crtc) < 0) 
+		if(ioctl(m->framebuffer->shallow_fbdev_fd, FBIO_WAITFORVSYNC, &crtc) < 0) 
 		{
 			gralloc_mali_vsync_report(MALI_VSYNC_EVENT_END_WAIT);
 			return -errno;