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