Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Oct 2012 03:52:18 +0000 (UTC)
From:      Eitan Adler <eadler@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r242282 - stable/8/sys/kern
Message-ID:  <201210290352.q9T3qJA2070052@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: eadler
Date: Mon Oct 29 03:52:18 2012
New Revision: 242282
URL: http://svn.freebsd.org/changeset/base/242282

Log:
  MFC r241855,r241859:
  	Update the kill(2) and killpg(2) man pages to the modern permission
  	checks. Also indicate killpg(2) is POSIX compliant.
  
  	Correct the killpg(2) return values:
  
  	Return EPERM if processes were found but they
  	were unable to be signaled.
  
  	Return the first error from p_cansignal if no signal was successful.
  
  Discussed with:	jilles
  Approved by:	cperciva (implicit)

Modified:
  stable/8/sys/kern/kern_sig.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/kern/   (props changed)

Modified: stable/8/sys/kern/kern_sig.c
==============================================================================
--- stable/8/sys/kern/kern_sig.c	Mon Oct 29 03:48:25 2012	(r242281)
+++ stable/8/sys/kern/kern_sig.c	Mon Oct 29 03:52:18 2012	(r242282)
@@ -1623,8 +1623,10 @@ killpg1(struct thread *td, int sig, int 
 {
 	struct proc *p;
 	struct pgrp *pgrp;
-	int nfound = 0;
+	int err;
+	int ret;
 
+	ret = ESRCH;
 	if (all) {
 		/*
 		 * broadcast
@@ -1637,11 +1639,14 @@ killpg1(struct thread *td, int sig, int 
 				PROC_UNLOCK(p);
 				continue;
 			}
-			if (p_cansignal(td, p, sig) == 0) {
-				nfound++;
+			err = p_cansignal(td, p, sig);
+			if (err == 0) {
 				if (sig)
 					pksignal(p, sig, ksi);
+				ret = err;
 			}
+			else if (ret == ESRCH)
+				ret = err;
 			PROC_UNLOCK(p);
 		}
 		sx_sunlock(&allproc_lock);
@@ -1668,16 +1673,19 @@ killpg1(struct thread *td, int sig, int 
 				PROC_UNLOCK(p);
 				continue;
 			}
-			if (p_cansignal(td, p, sig) == 0) {
-				nfound++;
+			err = p_cansignal(td, p, sig);
+			if (err == 0) {
 				if (sig)
 					pksignal(p, sig, ksi);
+				ret = err;
 			}
+			else if (ret == ESRCH)
+				ret = err;
 			PROC_UNLOCK(p);
 		}
 		PGRP_UNLOCK(pgrp);
 	}
-	return (nfound ? 0 : ESRCH);
+	return (ret);
 }
 
 #ifndef _SYS_SYSPROTO_H_



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210290352.q9T3qJA2070052>