[PATCH 0/1] *** Fix kill(-1,s) returning 0 on 0 kills ***
From: Petr Skocik
Date: Tue Nov 22 2022 - 11:16:22 EST
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