diff options
-rw-r--r-- | tests/fdsan_test.cpp | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/tests/fdsan_test.cpp b/tests/fdsan_test.cpp index a57e7c7e2..fb3f73dc3 100644 --- a/tests/fdsan_test.cpp +++ b/tests/fdsan_test.cpp @@ -24,12 +24,14 @@ #include <stdlib.h> #include <sys/types.h> -#include <unordered_map> - #if defined(__BIONIC__) #include <android/fdsan.h> #endif +#include <unordered_map> + +#include <android-base/unique_fd.h> + #define FDSAN_TEST(test_name) TEST_F(FdsanTest, test_name) #define EXPECT_FDSAN_DEATH(expression, regex) \ EXPECT_DEATH((android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_FATAL), expression), \ @@ -158,3 +160,35 @@ TEST_F(FdsanTest, owner_value_low) { "0x1"); #endif } + +TEST_F(FdsanTest, unique_fd_unowned_close) { +#if defined(__BIONIC__) + android::base::unique_fd fd(open("/dev/null", O_RDONLY)); + android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_FATAL); + EXPECT_FDSAN_DEATH(close(fd.get()), "expected to be unowned, actually owned by unique_fd"); +#endif +} + +TEST_F(FdsanTest, unique_fd_untag_on_release) { + android::base::unique_fd fd(open("/dev/null", O_RDONLY)); + close(fd.release()); +} + +TEST_F(FdsanTest, unique_fd_move) { + android::base::unique_fd fd(open("/dev/null", O_RDONLY)); + android::base::unique_fd fd_moved = std::move(fd); + ASSERT_EQ(-1, fd.get()); + ASSERT_GT(fd_moved.get(), -1); +} + +TEST_F(FdsanTest, unique_fd_unowned_close_after_move) { +#if defined(__BIONIC__) + android::base::unique_fd fd(open("/dev/null", O_RDONLY)); + android::base::unique_fd fd_moved = std::move(fd); + ASSERT_EQ(-1, fd.get()); + ASSERT_GT(fd_moved.get(), -1); + + android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_FATAL); + EXPECT_FDSAN_DEATH(close(fd_moved.get()), "expected to be unowned, actually owned by unique_fd"); +#endif +} |