// SPDX-License-Identifier: GPL-2.0 /* * This test covers the PR_SET_NAME functionality of prctl calls */ #include #include #include #include "../kselftest_harness.h" #define CHANGE_NAME "changename" #define EMPTY_NAME "" #define TASK_COMM_LEN 16 #define MAX_PATH_LEN 50 int set_name(char *name) { int res; res = prctl(PR_SET_NAME, name, NULL, NULL, NULL); if (res < 0) return -errno; return res; } int check_is_name_correct(char *check_name) { char name[TASK_COMM_LEN]; int res; res = prctl(PR_GET_NAME, name, NULL, NULL, NULL); if (res < 0) return -errno; return !strcmp(name, check_name); } int check_null_pointer(char *check_name) { char *name = NULL; int res; res = prctl(PR_GET_NAME, name, NULL, NULL, NULL); return res; } int check_name(void) { int pid; pid = getpid(); FILE *fptr = NULL; char path[MAX_PATH_LEN] = {}; char name[TASK_COMM_LEN] = {}; char output[TASK_COMM_LEN] = {}; int j; j = snprintf(path, MAX_PATH_LEN, "/proc/self/task/%d/comm", pid); fptr = fopen(path, "r"); if (!fptr) return -EIO; fscanf(fptr, "%s", output); if (ferror(fptr)) return -EIO; int res = prctl(PR_GET_NAME, name, NULL, NULL, NULL); if (res < 0) return -errno; return !strcmp(output, name); } TEST(rename_process) { EXPECT_GE(set_name(CHANGE_NAME), 0); EXPECT_TRUE(check_is_name_correct(CHANGE_NAME)); EXPECT_GE(set_name(EMPTY_NAME), 0); EXPECT_TRUE(check_is_name_correct(EMPTY_NAME)); EXPECT_GE(set_name(CHANGE_NAME), 0); EXPECT_LT(check_null_pointer(CHANGE_NAME), 0); EXPECT_TRUE(check_name()); } TEST_HARNESS_MAIN