diff --git a/common/support/NativeHandle.cpp b/common/support/NativeHandle.cpp index 321d7a8cba..126ef2e897 100644 --- a/common/support/NativeHandle.cpp +++ b/common/support/NativeHandle.cpp @@ -22,6 +22,13 @@ namespace android { using aidl::android::hardware::common::NativeHandle; +/** + * Checks if a NativeHandle is null + */ +bool isAidlNativeHandleEmpty(const NativeHandle& handle) { + return handle.fds.empty() && handle.ints.empty(); +} + static native_handle_t* fromAidl(const NativeHandle& handle, bool doDup) { native_handle_t* to = native_handle_create(handle.fds.size(), handle.ints.size()); if (!to) return nullptr; diff --git a/common/support/include/aidlcommonsupport/NativeHandle.h b/common/support/include/aidlcommonsupport/NativeHandle.h index 10eecbaca3..b5ea1dd2bd 100644 --- a/common/support/include/aidlcommonsupport/NativeHandle.h +++ b/common/support/include/aidlcommonsupport/NativeHandle.h @@ -21,6 +21,11 @@ namespace android { +/** + * Checks if a NativeHandle is empty. + */ +bool isAidlNativeHandleEmpty(const aidl::android::hardware::common::NativeHandle& handle); + /** * Creates a libcutils native handle from an AIDL native handle, but it does not * dup internally, so it will contain the same FDs as the handle itself. The diff --git a/common/support/test.cpp b/common/support/test.cpp index 235927709c..9b79581379 100644 --- a/common/support/test.cpp +++ b/common/support/test.cpp @@ -62,6 +62,7 @@ static NativeHandle makeTestAidlHandle() { TEST(ConvertNativeHandle, MakeFromAidlEmpty) { NativeHandle handle; + EXPECT_TRUE(isAidlNativeHandleEmpty(handle)); native_handle_t* to = makeFromAidl(handle); checkEq(handle, to, false /*exceptFds*/); // no native_handle_close b/c fds are owned by NativeHandle @@ -70,6 +71,7 @@ TEST(ConvertNativeHandle, MakeFromAidlEmpty) { TEST(ConvertNativeHandle, MakeFromAidl) { NativeHandle handle = makeTestAidlHandle(); + EXPECT_FALSE(isAidlNativeHandleEmpty(handle)); native_handle_t* to = makeFromAidl(handle); checkEq(handle, to, false /*exceptFds*/); // no native_handle_close b/c fds are owned by NativeHandle @@ -106,6 +108,7 @@ static native_handle_t* makeTestLibcutilsHandle() { TEST(ConvertNativeHandle, MakeToAidlEmpty) { native_handle_t* handle = native_handle_create(0, 0); NativeHandle to = makeToAidl(handle); + EXPECT_TRUE(isAidlNativeHandleEmpty(to)); checkEq(to, handle, false /*exceptFds*/); // no native_handle_close b/c fds are owned by NativeHandle now EXPECT_EQ(0, native_handle_delete(handle)); @@ -114,6 +117,7 @@ TEST(ConvertNativeHandle, MakeToAidlEmpty) { TEST(ConvertNativeHandle, MakeToAidl) { native_handle_t* handle = makeTestLibcutilsHandle(); NativeHandle to = makeToAidl(handle); + EXPECT_FALSE(isAidlNativeHandleEmpty(to)); checkEq(to, handle, false /*exceptFds*/); // no native_handle_close b/c fds are owned by NativeHandle now EXPECT_EQ(0, native_handle_delete(handle)); @@ -122,6 +126,7 @@ TEST(ConvertNativeHandle, MakeToAidl) { TEST(ConvertNativeHandle, DupToAidlEmpty) { native_handle_t* handle = native_handle_create(0, 0); NativeHandle to = dupToAidl(handle); + EXPECT_TRUE(isAidlNativeHandleEmpty(to)); checkEq(to, handle, true /*exceptFds*/); EXPECT_EQ(0, native_handle_close(handle)); EXPECT_EQ(0, native_handle_delete(handle)); @@ -130,6 +135,7 @@ TEST(ConvertNativeHandle, DupToAidlEmpty) { TEST(ConvertNativeHandle, DupToAidl) { native_handle_t* handle = makeTestLibcutilsHandle(); NativeHandle to = dupToAidl(handle); + EXPECT_FALSE(isAidlNativeHandleEmpty(to)); checkEq(to, handle, true /*exceptFds*/); EXPECT_EQ(0, native_handle_close(handle)); EXPECT_EQ(0, native_handle_delete(handle));