improve renice user error messages

Improve error handling for invalid user names and UIDs in renice:
- Use warnx() and err() for consistent error reporting
- Set errno = EINVAL for invalid input
- Provide clearer error messages for invalid user names and UIDs
- Add test cases for invalid user input

Signed-off-by: androvonx95 <androvonx95@tutamail.com>
Reviewed by: imp
Pull Request: https://github.com/freebsd/freebsd-src/pull/1768
This commit is contained in:
androvonx95
2025-07-15 23:31:28 +05:30
committed by Warner Losh
parent 9b48646ab3
commit 925f536824
2 changed files with 84 additions and 4 deletions
+27 -4
View File
@@ -97,6 +97,7 @@ main(int argc, char *argv[])
if ((pwd = getpwnam(*argv)) != NULL)
who = pwd->pw_uid;
else if (getnum("uid", *argv, &who)) {
warnx("invalid uid: %s", *argv);
errs++;
continue;
} else if (who < 0) {
@@ -106,6 +107,7 @@ main(int argc, char *argv[])
}
} else {
if (getnum("pid", *argv, &who)) {
warnx("invalid pid: %s", *argv);
errs++;
continue;
}
@@ -126,11 +128,27 @@ static int
donice(int which, int who, int prio, bool incr)
{
int oldprio;
const char *who_type;
switch (which) {
case PRIO_PROCESS:
who_type = "process";
break;
case PRIO_PGRP:
who_type = "process group";
break;
case PRIO_USER:
who_type = "user";
break;
default:
who_type = "unknown";
break;
}
errno = 0;
oldprio = getpriority(which, who);
if (oldprio == -1 && errno) {
warn("%d: getpriority", who);
warnx("%s %d: getpriority failed", who_type, who);
return (1);
}
if (incr)
@@ -140,11 +158,16 @@ donice(int which, int who, int prio, bool incr)
if (prio < PRIO_MIN)
prio = PRIO_MIN;
if (setpriority(which, who, prio) < 0) {
warn("%d: setpriority", who);
if (errno == EPERM) {
warnx("Permission denied: cannot set priority for %s %d",
who_type, who);
return (1);
}
warnx("%s %d: setpriority failed", who_type, who);
return (1);
}
fprintf(stderr, "%d: old priority %d, new priority %d\n", who,
oldprio, prio);
fprintf(stderr, "%s %d: old priority %d, new priority %d\n", who_type,
who, oldprio, prio);
return (0);
}
+57
View File
@@ -51,6 +51,50 @@ renice_rel_pid_body() {
kill $pid
}
atf_test_case renice_invalid_priority
renice_invalid_priority_head() {
atf_set "descr" "Verify handling of invalid priority values"
}
renice_invalid_priority_body() {
local pid
sleep 60 &
pid=$!
# Test out of range priority
atf_check -s exit:1 -e match:"numeric value out of range" renice 100000 $pid
atf_check -s exit:1 -e match:"numeric value out of range" renice -100000 $pid
# Test invalid priority format
atf_check -s exit:1 -e match:"invalid numeric value" renice "abc" $pid
atf_check -s exit:1 -e match:"invalid numeric value" renice "12.3" $pid
kill $pid
}
atf_test_case renice_permission_denied
renice_permission_denied_head() {
atf_set "descr" "Verify handling of permission denied cases"
}
renice_permission_denied_body() {
local pid
sleep 60 &
pid=$!
# Test permission denied with non-root user
atf_check -s exit:1 -e match:"Permission denied: cannot set priority" renice -n 10 $pid
kill $pid
}
atf_test_case renice_nonexistent_process
renice_nonexistent_process_head() {
atf_set "descr" "Verify handling of non-existent process"
}
renice_nonexistent_process_body() {
# Test with a non-existent PID
atf_check -s exit:1 -e match:"process 999999 not found" renice 10 999999
}
atf_test_case renice_abs_pgid
renice_abs_pgid_head() {
atf_set "descr" "Set a process group's nice number to an absolute value"
@@ -115,6 +159,18 @@ renice_rel_user_body() {
kill $pid
}
atf_test_case renice_invalid_user
renice_invalid_user_head() {
atf_set "descr" "Verify handling of invalid user names"
}
renice_invalid_user_body() {
# Test with non-existent user name
atf_check -s exit:1 -e match:"Invalid user name or UID: nonexist" renice 10 -u nonexist
# Test with invalid UID
atf_check -s exit:1 -e match:"Invalid UID: -1" renice 10 -u -1
}
atf_test_case renice_delim
renice_delim_head() {
atf_set "descr" "Test various delimiter positions"
@@ -169,6 +225,7 @@ atf_init_test_cases() {
atf_add_test_case renice_rel_pgid
atf_add_test_case renice_abs_user
atf_add_test_case renice_rel_user
atf_add_test_case renice_invalid_user
atf_add_test_case renice_delim
atf_add_test_case renice_incr_noarg
}