From cad4e327bf3a2ad3a33d2cbc3f7039473f0adffb Mon Sep 17 00:00:00 2001 From: Ytai Ben-Tsvi Date: Fri, 21 May 2021 14:26:03 -0700 Subject: [PATCH] Proper duping / closing of FileDescriptors While looking into another bug, I noticed that the file descriptors do not get properly duped when converting to HidlMemory and that they aren't explicitly closed when creating a temporary instance of SharedMemory. Test: Manual verification of ST functionality, which uses these utilities. Fixes: 188931943 Change-Id: I76322c56c58be5db8f1a40eb20eb3b96552412f9 --- core/java/android/os/HidlMemoryUtil.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/java/android/os/HidlMemoryUtil.java b/core/java/android/os/HidlMemoryUtil.java index 4252fe30f4ad5..a1b2aef5884a1 100644 --- a/core/java/android/os/HidlMemoryUtil.java +++ b/core/java/android/os/HidlMemoryUtil.java @@ -76,8 +76,7 @@ public final class HidlMemoryUtil { return new HidlMemory("ashmem", 0, null); } - try { - SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.length); + try (SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.length)) { ByteBuffer buffer = shmem.mapReadWrite(); buffer.put(input); shmem.unmap(buffer); @@ -119,8 +118,7 @@ public final class HidlMemoryUtil { return new HidlMemory("ashmem", 0, null); } - try { - SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.size()); + try (SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.size())) { ByteBuffer buffer = shmem.mapReadWrite(); for (Byte b : input) { buffer.put(b); @@ -214,8 +212,12 @@ public final class HidlMemoryUtil { if (fd == null) { return new HidlMemory("ashmem", 0, null); } - NativeHandle handle = new NativeHandle(fd, true); - return new HidlMemory("ashmem", size, handle); + try { + NativeHandle handle = new NativeHandle(Os.dup(fd), true); + return new HidlMemory("ashmem", size, handle); + } catch (ErrnoException e) { + throw new RuntimeException(e); + } } private static ByteBuffer getBuffer(@NonNull HidlMemory mem) {