The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=925f53682469ea12c017b48114b16e8f1627fb0b

commit 925f53682469ea12c017b48114b16e8f1627fb0b
Author:     androvonx95 <[email protected]>
AuthorDate: 2025-07-15 18:01:28 +0000
Commit:     Warner Losh <[email protected]>
CommitDate: 2026-06-10 12:35:02 +0000

    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 <[email protected]>
    Reviewed by: imp
    Pull Request: https://github.com/freebsd/freebsd-src/pull/1768
---
 usr.bin/renice/renice.c             | 31 +++++++++++++++++---
 usr.bin/renice/tests/renice_test.sh | 57 +++++++++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+), 4 deletions(-)

diff --git a/usr.bin/renice/renice.c b/usr.bin/renice/renice.c
index 4931a39c0f67..240ddf54134c 100644
--- a/usr.bin/renice/renice.c
+++ b/usr.bin/renice/renice.c
@@ -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);
 }
 
diff --git a/usr.bin/renice/tests/renice_test.sh 
b/usr.bin/renice/tests/renice_test.sh
index 7983eb594716..116f1be60fe9 100755
--- a/usr.bin/renice/tests/renice_test.sh
+++ b/usr.bin/renice/tests/renice_test.sh
@@ -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
 }

Reply via email to