get_set_sud.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-License-Identifier: GPL-2.0
  2. #define _GNU_SOURCE
  3. #include "kselftest_harness.h"
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. #include <sys/wait.h>
  8. #include <sys/syscall.h>
  9. #include <sys/prctl.h>
  10. #include "linux/ptrace.h"
  11. static int sys_ptrace(int request, pid_t pid, void *addr, void *data)
  12. {
  13. return syscall(SYS_ptrace, request, pid, addr, data);
  14. }
  15. TEST(get_set_sud)
  16. {
  17. struct ptrace_sud_config config;
  18. pid_t child;
  19. int ret = 0;
  20. int status;
  21. child = fork();
  22. ASSERT_GE(child, 0);
  23. if (child == 0) {
  24. ASSERT_EQ(0, sys_ptrace(PTRACE_TRACEME, 0, 0, 0)) {
  25. TH_LOG("PTRACE_TRACEME: %m");
  26. }
  27. kill(getpid(), SIGSTOP);
  28. _exit(1);
  29. }
  30. waitpid(child, &status, 0);
  31. memset(&config, 0xff, sizeof(config));
  32. config.mode = PR_SYS_DISPATCH_ON;
  33. ret = sys_ptrace(PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG, child,
  34. (void *)sizeof(config), &config);
  35. ASSERT_EQ(ret, 0);
  36. ASSERT_EQ(config.mode, PR_SYS_DISPATCH_OFF);
  37. ASSERT_EQ(config.selector, 0);
  38. ASSERT_EQ(config.offset, 0);
  39. ASSERT_EQ(config.len, 0);
  40. config.mode = PR_SYS_DISPATCH_ON;
  41. config.selector = 0;
  42. config.offset = 0x400000;
  43. config.len = 0x1000;
  44. ret = sys_ptrace(PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG, child,
  45. (void *)sizeof(config), &config);
  46. ASSERT_EQ(ret, 0);
  47. memset(&config, 1, sizeof(config));
  48. ret = sys_ptrace(PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG, child,
  49. (void *)sizeof(config), &config);
  50. ASSERT_EQ(ret, 0);
  51. ASSERT_EQ(config.mode, PR_SYS_DISPATCH_ON);
  52. ASSERT_EQ(config.selector, 0);
  53. ASSERT_EQ(config.offset, 0x400000);
  54. ASSERT_EQ(config.len, 0x1000);
  55. kill(child, SIGKILL);
  56. }
  57. TEST_HARNESS_MAIN