Messages in this thread | | | From | Petr Skocik <> | Subject | [PATCH 0/1] *** Fix kill(-1,s) returning 0 on 0 kills *** | Date | Tue, 22 Nov 2022 17:12:40 +0100 |
| |
Hi. I've never sent a kernel patch before but this one seemed trivial, so I thought I'd give it a shot.
My issue: kill(-1,s) on Linux doesn't return -ESCHR when it has nothing to kill.
The code sample below demonstrates the problem, which gets fixed by the patch:
#define _GNU_SOURCE #include <assert.h> #include <errno.h> #include <signal.h> #include <stdio.h> #include <sys/wait.h> #include <unistd.h> #define VICTIM_UID 4200 //check these are safe to use on your system! #define UNUSED_UID 4300 int main(){ uid_t r,e,s; if(geteuid()) return 1; //requires root privileges
//pipe to let the parent know when the child has changed ids int fds[2]; if(0>pipe(fds)) return 1; pid_t pid; if(0>(pid=fork())) return 1; else if(0==pid){ setreuid(VICTIM_UID,VICTIM_UID); getresuid(&r,&e,&s); printf("child: %u %u %u\n", r,e,s); close(fds[0]); close(fds[1]); //let the parent continue for(;;) pause(); } close(fds[1]); read(fds[0],&(char){0},1); //wait for uid change in the child
#if 1 setreuid(VICTIM_UID,(uid_t)-1); seteuid(VICTIM_UID); #else setresuid(UNUSED_UID,VICTIM_UID,0); #endif getresuid(&r,&e,&s); printf("parent: %u %u %u\n", r,e,s); //4200 4200 0
int err = kill(-1,-111); (void)err; //test -EINVAL assert(err < 0 && errno == EINVAL);
int rc = kill(-1,SIGTERM); //test 0 if(rc>=0) wait(0); int rc2 = kill(-1,SIGTERM); //test -ESCHR printf("1st kill ok==%d; 2nd kill ESRCH==%d\n", rc==0, rc2<0&& errno==ESRCH); }
Thank you for considering the patch.
Best regards, Petr S.
Petr Skocik (1): Fix kill(-1,s) returning 0 on 0 kills
kernel/signal.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
-- 2.25.1
| |