Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/binderfs: Fix harness API usage

The binderfs test mixed the full harness API and the selftest API.
Adjust to use only the harness API so that the harness API can switch
to using the selftest API internally in future patches.

Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

authored by

Kees Cook and committed by
Shuah Khan
eaa163ca ce79097a

+148 -140
+148 -140
tools/testing/selftests/filesystems/binderfs/binderfs_test.c
··· 21 21 #include <linux/android/binder.h> 22 22 #include <linux/android/binderfs.h> 23 23 24 - #include "../../kselftest.h" 25 24 #include "../../kselftest_harness.h" 26 25 27 26 #define DEFAULT_THREADS 4 ··· 36 37 fd = -EBADF; \ 37 38 } 38 39 39 - #define log_exit(format, ...) \ 40 - ({ \ 41 - fprintf(stderr, format "\n", ##__VA_ARGS__); \ 42 - exit(EXIT_FAILURE); \ 43 - }) 44 - 45 - static void change_mountns(void) 40 + static void change_mountns(struct __test_metadata *_metadata) 46 41 { 47 42 int ret; 48 43 49 44 ret = unshare(CLONE_NEWNS); 50 - if (ret < 0) 51 - ksft_exit_fail_msg("%s - Failed to unshare mount namespace\n", 52 - strerror(errno)); 45 + ASSERT_EQ(ret, 0) { 46 + TH_LOG("%s - Failed to unshare mount namespace", 47 + strerror(errno)); 48 + } 53 49 54 50 ret = mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, 0); 55 - if (ret < 0) 56 - ksft_exit_fail_msg("%s - Failed to mount / as private\n", 57 - strerror(errno)); 51 + ASSERT_EQ(ret, 0) { 52 + TH_LOG("%s - Failed to mount / as private", 53 + strerror(errno)); 54 + } 58 55 } 59 56 60 - static void rmdir_protect_errno(const char *dir) 57 + static int __do_binderfs_test(struct __test_metadata *_metadata) 61 58 { 62 - int saved_errno = errno; 63 - (void)rmdir(dir); 64 - errno = saved_errno; 65 - } 66 - 67 - static int __do_binderfs_test(void) 68 - { 69 - int fd, ret, saved_errno; 59 + int fd, ret, saved_errno, result = 1; 70 60 size_t len; 71 61 ssize_t wret; 72 62 struct binderfs_device device = { 0 }; ··· 63 75 char binderfs_mntpt[] = P_tmpdir "/binderfs_XXXXXX", 64 76 device_path[sizeof(P_tmpdir "/binderfs_XXXXXX/") + BINDERFS_MAX_NAME]; 65 77 66 - change_mountns(); 78 + change_mountns(_metadata); 67 79 68 - if (!mkdtemp(binderfs_mntpt)) 69 - ksft_exit_fail_msg( 70 - "%s - Failed to create binderfs mountpoint\n", 80 + EXPECT_NE(mkdtemp(binderfs_mntpt), NULL) { 81 + TH_LOG("%s - Failed to create binderfs mountpoint", 71 82 strerror(errno)); 72 - 73 - ret = mount(NULL, binderfs_mntpt, "binder", 0, 0); 74 - if (ret < 0) { 75 - if (errno != ENODEV) 76 - ksft_exit_fail_msg("%s - Failed to mount binderfs\n", 77 - strerror(errno)); 78 - 79 - rmdir_protect_errno(binderfs_mntpt); 80 - return 1; 83 + goto out; 81 84 } 82 85 83 - /* binderfs mount test passed */ 84 - ksft_inc_pass_cnt(); 86 + ret = mount(NULL, binderfs_mntpt, "binder", 0, 0); 87 + EXPECT_EQ(ret, 0) { 88 + if (errno == ENODEV) 89 + XFAIL(goto out, "binderfs missing"); 90 + TH_LOG("%s - Failed to mount binderfs", strerror(errno)); 91 + goto rmdir; 92 + } 93 + 94 + /* success: binderfs mounted */ 85 95 86 96 memcpy(device.name, "my-binder", strlen("my-binder")); 87 97 88 98 snprintf(device_path, sizeof(device_path), "%s/binder-control", binderfs_mntpt); 89 99 fd = open(device_path, O_RDONLY | O_CLOEXEC); 90 - if (fd < 0) 91 - ksft_exit_fail_msg( 92 - "%s - Failed to open binder-control device\n", 100 + EXPECT_GE(fd, 0) { 101 + TH_LOG("%s - Failed to open binder-control device", 93 102 strerror(errno)); 103 + goto umount; 104 + } 94 105 95 106 ret = ioctl(fd, BINDER_CTL_ADD, &device); 96 107 saved_errno = errno; 97 108 close(fd); 98 109 errno = saved_errno; 99 - if (ret < 0) { 100 - rmdir_protect_errno(binderfs_mntpt); 101 - ksft_exit_fail_msg( 102 - "%s - Failed to allocate new binder device\n", 110 + EXPECT_GE(ret, 0) { 111 + TH_LOG("%s - Failed to allocate new binder device", 103 112 strerror(errno)); 113 + goto umount; 104 114 } 105 115 106 - ksft_print_msg( 107 - "Allocated new binder device with major %d, minor %d, and name %s\n", 116 + TH_LOG("Allocated new binder device with major %d, minor %d, and name %s", 108 117 device.major, device.minor, device.name); 109 118 110 - /* binder device allocation test passed */ 111 - ksft_inc_pass_cnt(); 119 + /* success: binder device allocation */ 112 120 113 121 snprintf(device_path, sizeof(device_path), "%s/my-binder", binderfs_mntpt); 114 122 fd = open(device_path, O_CLOEXEC | O_RDONLY); 115 - if (fd < 0) { 116 - rmdir_protect_errno(binderfs_mntpt); 117 - ksft_exit_fail_msg("%s - Failed to open my-binder device\n", 118 - strerror(errno)); 123 + EXPECT_GE(fd, 0) { 124 + TH_LOG("%s - Failed to open my-binder device", 125 + strerror(errno)); 126 + goto umount; 119 127 } 120 128 121 129 ret = ioctl(fd, BINDER_VERSION, &version); 122 130 saved_errno = errno; 123 131 close(fd); 124 132 errno = saved_errno; 125 - if (ret < 0) { 126 - rmdir_protect_errno(binderfs_mntpt); 127 - ksft_exit_fail_msg( 128 - "%s - Failed to open perform BINDER_VERSION request\n", 133 + EXPECT_GE(ret, 0) { 134 + TH_LOG("%s - Failed to open perform BINDER_VERSION request", 129 135 strerror(errno)); 136 + goto umount; 130 137 } 131 138 132 - ksft_print_msg("Detected binder version: %d\n", 133 - version.protocol_version); 139 + TH_LOG("Detected binder version: %d", version.protocol_version); 134 140 135 - /* binder transaction with binderfs binder device passed */ 136 - ksft_inc_pass_cnt(); 141 + /* success: binder transaction with binderfs binder device */ 137 142 138 143 ret = unlink(device_path); 139 - if (ret < 0) { 140 - rmdir_protect_errno(binderfs_mntpt); 141 - ksft_exit_fail_msg("%s - Failed to delete binder device\n", 142 - strerror(errno)); 144 + EXPECT_EQ(ret, 0) { 145 + TH_LOG("%s - Failed to delete binder device", 146 + strerror(errno)); 147 + goto umount; 143 148 } 144 149 145 - /* binder device removal passed */ 146 - ksft_inc_pass_cnt(); 150 + /* success: binder device removal */ 147 151 148 152 snprintf(device_path, sizeof(device_path), "%s/binder-control", binderfs_mntpt); 149 153 ret = unlink(device_path); 150 - if (!ret) { 151 - rmdir_protect_errno(binderfs_mntpt); 152 - ksft_exit_fail_msg("Managed to delete binder-control device\n"); 153 - } else if (errno != EPERM) { 154 - rmdir_protect_errno(binderfs_mntpt); 155 - ksft_exit_fail_msg( 156 - "%s - Failed to delete binder-control device but exited with unexpected error code\n", 154 + EXPECT_NE(ret, 0) { 155 + TH_LOG("Managed to delete binder-control device"); 156 + goto umount; 157 + } 158 + EXPECT_EQ(errno, EPERM) { 159 + TH_LOG("%s - Failed to delete binder-control device but exited with unexpected error code", 157 160 strerror(errno)); 161 + goto umount; 158 162 } 159 163 160 - /* binder-control device removal failed as expected */ 161 - ksft_inc_xfail_cnt(); 164 + /* success: binder-control device removal failed as expected */ 165 + result = 0; 162 166 163 - on_error: 167 + umount: 164 168 ret = umount2(binderfs_mntpt, MNT_DETACH); 165 - rmdir_protect_errno(binderfs_mntpt); 166 - if (ret < 0) 167 - ksft_exit_fail_msg("%s - Failed to unmount binderfs\n", 168 - strerror(errno)); 169 - 170 - /* binderfs unmount test passed */ 171 - ksft_inc_pass_cnt(); 172 - return 0; 169 + EXPECT_EQ(ret, 0) { 170 + TH_LOG("%s - Failed to unmount binderfs", strerror(errno)); 171 + } 172 + rmdir: 173 + ret = rmdir(binderfs_mntpt); 174 + EXPECT_EQ(ret, 0) { 175 + TH_LOG("%s - Failed to rmdir binderfs mount", strerror(errno)); 176 + } 177 + out: 178 + return result; 173 179 } 174 180 175 181 static int wait_for_pid(pid_t pid) ··· 273 291 return 0; 274 292 } 275 293 276 - static void change_userns(int syncfds[2]) 294 + static void change_userns(struct __test_metadata *_metadata, int syncfds[2]) 277 295 { 278 296 int ret; 279 297 char buf; ··· 281 299 close_prot_errno_disarm(syncfds[1]); 282 300 283 301 ret = unshare(CLONE_NEWUSER); 284 - if (ret < 0) 285 - ksft_exit_fail_msg("%s - Failed to unshare user namespace\n", 286 - strerror(errno)); 302 + ASSERT_EQ(ret, 0) { 303 + TH_LOG("%s - Failed to unshare user namespace", 304 + strerror(errno)); 305 + } 287 306 288 307 ret = write_nointr(syncfds[0], "1", 1); 289 - if (ret != 1) 290 - ksft_exit_fail_msg("write_nointr() failed\n"); 308 + ASSERT_EQ(ret, 1) { 309 + TH_LOG("write_nointr() failed"); 310 + } 291 311 292 312 ret = read_nointr(syncfds[0], &buf, 1); 293 - if (ret != 1) 294 - ksft_exit_fail_msg("read_nointr() failed\n"); 313 + ASSERT_EQ(ret, 1) { 314 + TH_LOG("read_nointr() failed"); 315 + } 295 316 296 317 close_prot_errno_disarm(syncfds[0]); 297 318 298 - if (setid_userns_root()) 299 - ksft_exit_fail_msg("setid_userns_root() failed"); 319 + ASSERT_EQ(setid_userns_root(), 0) { 320 + TH_LOG("setid_userns_root() failed"); 321 + } 300 322 } 301 323 302 - static void change_idmaps(int syncfds[2], pid_t pid) 324 + static void change_idmaps(struct __test_metadata *_metadata, int syncfds[2], pid_t pid) 303 325 { 304 326 int ret; 305 327 char buf; ··· 312 326 close_prot_errno_disarm(syncfds[0]); 313 327 314 328 ret = read_nointr(syncfds[1], &buf, 1); 315 - if (ret != 1) 316 - ksft_exit_fail_msg("read_nointr() failed\n"); 329 + ASSERT_EQ(ret, 1) { 330 + TH_LOG("read_nointr() failed"); 331 + } 317 332 318 333 snprintf(id_map, sizeof(id_map), "0 %d 1\n", getuid()); 319 334 ret = write_id_mapping(UID_MAP, pid, id_map, strlen(id_map)); 320 - if (ret) 321 - ksft_exit_fail_msg("write_id_mapping(UID_MAP) failed"); 335 + ASSERT_EQ(ret, 0) { 336 + TH_LOG("write_id_mapping(UID_MAP) failed"); 337 + } 322 338 323 339 snprintf(id_map, sizeof(id_map), "0 %d 1\n", getgid()); 324 340 ret = write_id_mapping(GID_MAP, pid, id_map, strlen(id_map)); 325 - if (ret) 326 - ksft_exit_fail_msg("write_id_mapping(GID_MAP) failed"); 341 + ASSERT_EQ(ret, 0) { 342 + TH_LOG("write_id_mapping(GID_MAP) failed"); 343 + } 327 344 328 345 ret = write_nointr(syncfds[1], "1", 1); 329 - if (ret != 1) 330 - ksft_exit_fail_msg("write_nointr() failed"); 346 + ASSERT_EQ(ret, 1) { 347 + TH_LOG("write_nointr() failed"); 348 + } 331 349 332 350 close_prot_errno_disarm(syncfds[1]); 333 351 } 334 352 353 + struct __test_metadata *_thread_metadata; 335 354 static void *binder_version_thread(void *data) 336 355 { 356 + struct __test_metadata *_metadata = _thread_metadata; 337 357 int fd = PTR_TO_INT(data); 338 358 struct binder_version version = { 0 }; 339 359 int ret; 340 360 341 361 ret = ioctl(fd, BINDER_VERSION, &version); 342 362 if (ret < 0) 343 - ksft_print_msg("%s - Failed to open perform BINDER_VERSION request\n", strerror(errno)); 363 + TH_LOG("%s - Failed to open perform BINDER_VERSION request\n", 364 + strerror(errno)); 344 365 345 366 pthread_exit(data); 346 367 } ··· 370 377 device_path[sizeof(P_tmpdir "/binderfs_XXXXXX/") + BINDERFS_MAX_NAME]; 371 378 372 379 ret = socketpair(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, syncfds); 373 - if (ret < 0) 374 - ksft_exit_fail_msg("%s - Failed to create socket pair", strerror(errno)); 380 + ASSERT_EQ(ret, 0) { 381 + TH_LOG("%s - Failed to create socket pair", strerror(errno)); 382 + } 375 383 376 384 pid = fork(); 377 - if (pid < 0) { 385 + ASSERT_GE(pid, 0) { 386 + TH_LOG("%s - Failed to fork", strerror(errno)); 378 387 close_prot_errno_disarm(syncfds[0]); 379 388 close_prot_errno_disarm(syncfds[1]); 380 - ksft_exit_fail_msg("%s - Failed to fork", strerror(errno)); 381 389 } 382 390 383 391 if (pid == 0) { 384 392 int i, j, k, nthreads; 385 393 pthread_attr_t attr; 386 394 pthread_t threads[DEFAULT_THREADS]; 387 - change_userns(syncfds); 388 - change_mountns(); 395 + change_userns(_metadata, syncfds); 396 + change_mountns(_metadata); 389 397 390 - if (!mkdtemp(binderfs_mntpt)) 391 - log_exit("%s - Failed to create binderfs mountpoint\n", 392 - strerror(errno)); 398 + ASSERT_NE(mkdtemp(binderfs_mntpt), NULL) { 399 + TH_LOG("%s - Failed to create binderfs mountpoint", 400 + strerror(errno)); 401 + } 393 402 394 403 ret = mount(NULL, binderfs_mntpt, "binder", 0, 0); 395 - if (ret < 0) 396 - log_exit("%s - Failed to mount binderfs\n", strerror(errno)); 404 + ASSERT_EQ(ret, 0) { 405 + TH_LOG("%s - Failed to mount binderfs", strerror(errno)); 406 + } 397 407 398 408 for (int i = 0; i < ARRAY_SIZE(fds); i++) { 399 409 400 410 snprintf(device_path, sizeof(device_path), 401 411 "%s/binder-control", binderfs_mntpt); 402 412 fd = open(device_path, O_RDONLY | O_CLOEXEC); 403 - if (fd < 0) 404 - log_exit("%s - Failed to open binder-control device\n", strerror(errno)); 413 + ASSERT_GE(fd, 0) { 414 + TH_LOG("%s - Failed to open binder-control device", 415 + strerror(errno)); 416 + } 405 417 406 418 memset(&device, 0, sizeof(device)); 407 419 snprintf(device.name, sizeof(device.name), "%d", i); 408 420 ret = ioctl(fd, BINDER_CTL_ADD, &device); 409 421 close_prot_errno_disarm(fd); 410 - if (ret < 0) 411 - log_exit("%s - Failed to allocate new binder device\n", strerror(errno)); 422 + ASSERT_EQ(ret, 0) { 423 + TH_LOG("%s - Failed to allocate new binder device", 424 + strerror(errno)); 425 + } 412 426 413 427 snprintf(device_path, sizeof(device_path), "%s/%d", 414 428 binderfs_mntpt, i); 415 429 fds[i] = open(device_path, O_RDONLY | O_CLOEXEC); 416 - if (fds[i] < 0) 417 - log_exit("%s - Failed to open binder device\n", strerror(errno)); 430 + ASSERT_GE(fds[i], 0) { 431 + TH_LOG("%s - Failed to open binder device", strerror(errno)); 432 + } 418 433 } 419 434 420 435 ret = umount2(binderfs_mntpt, MNT_DETACH); 421 - rmdir_protect_errno(binderfs_mntpt); 422 - if (ret < 0) 423 - log_exit("%s - Failed to unmount binderfs\n", strerror(errno)); 436 + ASSERT_EQ(ret, 0) { 437 + TH_LOG("%s - Failed to unmount binderfs", strerror(errno)); 438 + rmdir(binderfs_mntpt); 439 + } 424 440 425 441 nthreads = get_nprocs_conf(); 426 442 if (nthreads > DEFAULT_THREADS) 427 443 nthreads = DEFAULT_THREADS; 428 444 445 + _thread_metadata = _metadata; 429 446 pthread_attr_init(&attr); 430 447 for (k = 0; k < ARRAY_SIZE(fds); k++) { 431 448 for (i = 0; i < nthreads; i++) { 432 449 ret = pthread_create(&threads[i], &attr, binder_version_thread, INT_TO_PTR(fds[k])); 433 450 if (ret) { 434 - ksft_print_msg("%s - Failed to create thread %d\n", strerror(errno), i); 451 + TH_LOG("%s - Failed to create thread %d", 452 + strerror(errno), i); 435 453 break; 436 454 } 437 455 } ··· 452 448 453 449 ret = pthread_join(threads[j], &fdptr); 454 450 if (ret) 455 - ksft_print_msg("%s - Failed to join thread %d for fd %d\n", strerror(errno), j, PTR_TO_INT(fdptr)); 451 + TH_LOG("%s - Failed to join thread %d for fd %d", 452 + strerror(errno), j, PTR_TO_INT(fdptr)); 456 453 } 457 454 } 458 455 pthread_attr_destroy(&attr); ··· 464 459 exit(EXIT_SUCCESS); 465 460 } 466 461 467 - change_idmaps(syncfds, pid); 462 + change_idmaps(_metadata, syncfds, pid); 468 463 469 464 ret = wait_for_pid(pid); 470 - if (ret) 471 - ksft_exit_fail_msg("wait_for_pid() failed"); 465 + ASSERT_EQ(ret, 0) { 466 + TH_LOG("wait_for_pid() failed"); 467 + } 472 468 } 473 469 474 470 TEST(binderfs_test_privileged) ··· 477 471 if (geteuid() != 0) 478 472 XFAIL(return, "Tests are not run as root. Skipping privileged tests"); 479 473 480 - if (__do_binderfs_test() == 1) 474 + if (__do_binderfs_test(_metadata)) 481 475 XFAIL(return, "The Android binderfs filesystem is not available"); 482 476 } 483 477 ··· 488 482 pid_t pid; 489 483 490 484 ret = socketpair(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, syncfds); 491 - if (ret < 0) 492 - ksft_exit_fail_msg("%s - Failed to create socket pair", strerror(errno)); 485 + ASSERT_EQ(ret, 0) { 486 + TH_LOG("%s - Failed to create socket pair", strerror(errno)); 487 + } 493 488 494 489 pid = fork(); 495 - if (pid < 0) { 490 + ASSERT_GE(pid, 0) { 496 491 close_prot_errno_disarm(syncfds[0]); 497 492 close_prot_errno_disarm(syncfds[1]); 498 - ksft_exit_fail_msg("%s - Failed to fork", strerror(errno)); 493 + TH_LOG("%s - Failed to fork", strerror(errno)); 499 494 } 500 495 501 496 if (pid == 0) { 502 - change_userns(syncfds); 503 - if (__do_binderfs_test() == 1) 497 + change_userns(_metadata, syncfds); 498 + if (__do_binderfs_test(_metadata)) 504 499 exit(2); 505 500 exit(EXIT_SUCCESS); 506 501 } 507 502 508 - change_idmaps(syncfds, pid); 503 + change_idmaps(_metadata, syncfds, pid); 509 504 510 505 ret = wait_for_pid(pid); 511 506 if (ret) { 512 507 if (ret == 2) 513 508 XFAIL(return, "The Android binderfs filesystem is not available"); 514 - else 515 - ksft_exit_fail_msg("wait_for_pid() failed"); 509 + ASSERT_EQ(ret, 0) { 510 + TH_LOG("wait_for_pid() failed"); 511 + } 516 512 } 517 513 } 518 514