95 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * This test covers the PR_SET_NAME functionality of prctl calls4 */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 1615#define MAX_PATH_LEN 5016 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_MAIN95