1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* 2 /* 3 * This test covers the PR_SET_NAME functional 3 * This test covers the PR_SET_NAME functionality of prctl calls 4 */ 4 */ 5 5 6 #include <errno.h> 6 #include <errno.h> 7 #include <sys/prctl.h> 7 #include <sys/prctl.h> 8 #include <string.h> 8 #include <string.h> 9 9 10 #include "../kselftest_harness.h" 10 #include "../kselftest_harness.h" 11 11 12 #define CHANGE_NAME "changename" 12 #define CHANGE_NAME "changename" 13 #define EMPTY_NAME "" 13 #define EMPTY_NAME "" 14 #define TASK_COMM_LEN 16 14 #define TASK_COMM_LEN 16 15 #define MAX_PATH_LEN 50 15 #define MAX_PATH_LEN 50 16 16 17 int set_name(char *name) 17 int set_name(char *name) 18 { 18 { 19 int res; 19 int res; 20 20 21 res = prctl(PR_SET_NAME, name, NULL, N 21 res = prctl(PR_SET_NAME, name, NULL, NULL, NULL); 22 22 23 if (res < 0) 23 if (res < 0) 24 return -errno; 24 return -errno; 25 return res; 25 return res; 26 } 26 } 27 27 28 int check_is_name_correct(char *check_name) 28 int check_is_name_correct(char *check_name) 29 { 29 { 30 char name[TASK_COMM_LEN]; 30 char name[TASK_COMM_LEN]; 31 int res; 31 int res; 32 32 33 res = prctl(PR_GET_NAME, name, NULL, N 33 res = prctl(PR_GET_NAME, name, NULL, NULL, NULL); 34 34 35 if (res < 0) 35 if (res < 0) 36 return -errno; 36 return -errno; 37 37 38 return !strcmp(name, check_name); 38 return !strcmp(name, check_name); 39 } 39 } 40 40 41 int check_null_pointer(char *check_name) 41 int check_null_pointer(char *check_name) 42 { 42 { 43 char *name = NULL; 43 char *name = NULL; 44 int res; 44 int res; 45 45 46 res = prctl(PR_GET_NAME, name, NULL, N 46 res = prctl(PR_GET_NAME, name, NULL, NULL, NULL); 47 47 48 return res; 48 return res; 49 } 49 } 50 50 51 int check_name(void) 51 int check_name(void) 52 { 52 { 53 53 54 int pid; 54 int pid; 55 55 56 pid = getpid(); 56 pid = getpid(); 57 FILE *fptr = NULL; 57 FILE *fptr = NULL; 58 char path[MAX_PATH_LEN] = {}; 58 char path[MAX_PATH_LEN] = {}; 59 char name[TASK_COMM_LEN] = {}; 59 char name[TASK_COMM_LEN] = {}; 60 char output[TASK_COMM_LEN] = {}; 60 char output[TASK_COMM_LEN] = {}; 61 int j; 61 int j; 62 62 63 j = snprintf(path, MAX_PATH_LEN, "/pro 63 j = snprintf(path, MAX_PATH_LEN, "/proc/self/task/%d/comm", pid); 64 fptr = fopen(path, "r"); 64 fptr = fopen(path, "r"); 65 if (!fptr) 65 if (!fptr) 66 return -EIO; 66 return -EIO; 67 67 68 fscanf(fptr, "%s", output); 68 fscanf(fptr, "%s", output); 69 if (ferror(fptr)) 69 if (ferror(fptr)) 70 return -EIO; 70 return -EIO; 71 71 72 int res = prctl(PR_GET_NAME, name, NUL 72 int res = prctl(PR_GET_NAME, name, NULL, NULL, NULL); 73 73 74 if (res < 0) 74 if (res < 0) 75 return -errno; 75 return -errno; 76 76 77 return !strcmp(output, name); 77 return !strcmp(output, name); 78 } 78 } 79 79 80 TEST(rename_process) { 80 TEST(rename_process) { 81 81 82 EXPECT_GE(set_name(CHANGE_NAME), 0); 82 EXPECT_GE(set_name(CHANGE_NAME), 0); 83 EXPECT_TRUE(check_is_name_correct(CHAN 83 EXPECT_TRUE(check_is_name_correct(CHANGE_NAME)); 84 84 85 EXPECT_GE(set_name(EMPTY_NAME), 0); 85 EXPECT_GE(set_name(EMPTY_NAME), 0); 86 EXPECT_TRUE(check_is_name_correct(EMPT 86 EXPECT_TRUE(check_is_name_correct(EMPTY_NAME)); 87 87 88 EXPECT_GE(set_name(CHANGE_NAME), 0); 88 EXPECT_GE(set_name(CHANGE_NAME), 0); 89 EXPECT_LT(check_null_pointer(CHANGE_NA 89 EXPECT_LT(check_null_pointer(CHANGE_NAME), 0); 90 90 91 EXPECT_TRUE(check_name()); 91 EXPECT_TRUE(check_name()); 92 } 92 } 93 93 94 TEST_HARNESS_MAIN 94 TEST_HARNESS_MAIN 95 95
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.