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
17int 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
28int 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
41int 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
51int 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
80TEST(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
94TEST_HARNESS_MAIN
95

source code of linux/tools/testing/selftests/prctl/set-process-name.c