make signal semantics more like system V;
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 23 May 1985 05:34:08 +0000 (21:34 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 23 May 1985 05:34:08 +0000 (21:34 -0800)
non-super user can do `kill -1 1' to kill all processes run by them,
return ESRCH instaed of EINVAL for `kill 0 1' when not in a process group

SCCS-vsn: sys/kern/kern_sig.c 6.15

usr/src/sys/kern/kern_sig.c

index 99e5c58..22c6715 100644 (file)
@@ -1,4 +1,4 @@
-/*     kern_sig.c      6.14    85/03/19        */
+/*     kern_sig.c      6.15    85/05/22        */
 
 #include "../machine/reg.h"
 #include "../machine/pte.h"
 
 #include "../machine/reg.h"
 #include "../machine/pte.h"
@@ -206,8 +206,7 @@ kill()
        }
        switch (uap->pid) {
        case -1:                /* broadcast signal */
        }
        switch (uap->pid) {
        case -1:                /* broadcast signal */
-               if (suser())
-                       u.u_error = killpg1(uap->signo, 0, 1);
+               u.u_error = killpg1(uap->signo, 0, 1);
                break;
        case 0:                 /* signal own process group */
                u.u_error = killpg1(uap->signo, 0, 0);
                break;
        case 0:                 /* signal own process group */
                u.u_error = killpg1(uap->signo, 0, 0);
@@ -247,18 +246,19 @@ killpg1(signo, pgrp, all)
                 */
                pgrp = u.u_procp->p_pgrp;
                if (pgrp == 0)
                 */
                pgrp = u.u_procp->p_pgrp;
                if (pgrp == 0)
-                       return (EINVAL);
+                       return (ESRCH);
        }
        for (f = 0, p = allproc; p != NULL; p = p->p_nxt) {
                if ((p->p_pgrp != pgrp && !all) || p->p_ppid == 0 ||
                    (p->p_flag&SSYS) || (all && p == u.u_procp))
                        continue;
        }
        for (f = 0, p = allproc; p != NULL; p = p->p_nxt) {
                if ((p->p_pgrp != pgrp && !all) || p->p_ppid == 0 ||
                    (p->p_flag&SSYS) || (all && p == u.u_procp))
                        continue;
-               f++;
                if (u.u_uid != 0 && u.u_uid != p->p_uid &&
                    (signo != SIGCONT || !inferior(p))) {
                if (u.u_uid != 0 && u.u_uid != p->p_uid &&
                    (signo != SIGCONT || !inferior(p))) {
-                       error = EPERM;
+                       if (!all)
+                               error = EPERM;
                        continue;
                }
                        continue;
                }
+               f++;
                if (signo)
                        psignal(p, signo);
        }
                if (signo)
                        psignal(p, signo);
        }