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