svn commit: r355723 - in head/sys: compat/linux kern sys

Edward Tomasz Napierala trasz at FreeBSD.org
Fri Dec 13 18:44:03 UTC 2019


Author: trasz
Date: Fri Dec 13 18:44:02 2019
New Revision: 355723
URL: https://svnweb.freebsd.org/changeset/base/355723

Log:
  Add kern_kill() and use it in Linuxulator.  It's just a cleanup,
  no functional changes.
  
  Reviewed by:	kib
  MFC after:	2 weeks
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D22645

Modified:
  head/sys/compat/linux/linux_signal.c
  head/sys/kern/kern_sig.c
  head/sys/sys/syscallsubr.h

Modified: head/sys/compat/linux/linux_signal.c
==============================================================================
--- head/sys/compat/linux/linux_signal.c	Fri Dec 13 18:39:36 2019	(r355722)
+++ head/sys/compat/linux/linux_signal.c	Fri Dec 13 18:44:02 2019	(r355723)
@@ -415,10 +415,7 @@ linux_rt_sigtimedwait(struct thread *td,
 int
 linux_kill(struct thread *td, struct linux_kill_args *args)
 {
-	struct kill_args /* {
-	    int pid;
-	    int signum;
-	} */ tmp;
+	int l_signum;
 
 	/*
 	 * Allow signal 0 as a means to check for privileges
@@ -427,12 +424,11 @@ linux_kill(struct thread *td, struct linux_kill_args *
 		return (EINVAL);
 
 	if (args->signum > 0)
-		tmp.signum = linux_to_bsd_signal(args->signum);
+		l_signum = linux_to_bsd_signal(args->signum);
 	else
-		tmp.signum = 0;
+		l_signum = 0;
 
-	tmp.pid = args->pid;
-	return (sys_kill(td, &tmp));
+	return (kern_kill(td, args->pid, l_signum));
 }
 
 static int

Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c	Fri Dec 13 18:39:36 2019	(r355722)
+++ head/sys/kern/kern_sig.c	Fri Dec 13 18:44:02 2019	(r355723)
@@ -1772,6 +1772,13 @@ struct kill_args {
 int
 sys_kill(struct thread *td, struct kill_args *uap)
 {
+
+	return (kern_kill(td, uap->pid, uap->signum));
+}
+
+int
+kern_kill(struct thread *td, pid_t pid, int signum)
+{
 	ksiginfo_t ksi;
 	struct proc *p;
 	int error;
@@ -1781,38 +1788,38 @@ sys_kill(struct thread *td, struct kill_args *uap)
 	 * The main rationale behind this is that abort(3) is implemented as
 	 * kill(getpid(), SIGABRT).
 	 */
-	if (IN_CAPABILITY_MODE(td) && uap->pid != td->td_proc->p_pid)
+	if (IN_CAPABILITY_MODE(td) && pid != td->td_proc->p_pid)
 		return (ECAPMODE);
 
-	AUDIT_ARG_SIGNUM(uap->signum);
-	AUDIT_ARG_PID(uap->pid);
-	if ((u_int)uap->signum > _SIG_MAXSIG)
+	AUDIT_ARG_SIGNUM(signum);
+	AUDIT_ARG_PID(pid);
+	if ((u_int)signum > _SIG_MAXSIG)
 		return (EINVAL);
 
 	ksiginfo_init(&ksi);
-	ksi.ksi_signo = uap->signum;
+	ksi.ksi_signo = signum;
 	ksi.ksi_code = SI_USER;
 	ksi.ksi_pid = td->td_proc->p_pid;
 	ksi.ksi_uid = td->td_ucred->cr_ruid;
 
-	if (uap->pid > 0) {
+	if (pid > 0) {
 		/* kill single process */
-		if ((p = pfind_any(uap->pid)) == NULL)
+		if ((p = pfind_any(pid)) == NULL)
 			return (ESRCH);
 		AUDIT_ARG_PROCESS(p);
-		error = p_cansignal(td, p, uap->signum);
-		if (error == 0 && uap->signum)
-			pksignal(p, uap->signum, &ksi);
+		error = p_cansignal(td, p, signum);
+		if (error == 0 && signum)
+			pksignal(p, signum, &ksi);
 		PROC_UNLOCK(p);
 		return (error);
 	}
-	switch (uap->pid) {
+	switch (pid) {
 	case -1:		/* broadcast signal */
-		return (killpg1(td, uap->signum, 0, 1, &ksi));
+		return (killpg1(td, signum, 0, 1, &ksi));
 	case 0:			/* signal own process group */
-		return (killpg1(td, uap->signum, 0, 0, &ksi));
+		return (killpg1(td, signum, 0, 0, &ksi));
 	default:		/* negative explicit process group */
-		return (killpg1(td, uap->signum, -uap->pid, 0, &ksi));
+		return (killpg1(td, signum, -pid, 0, &ksi));
 	}
 	/* NOTREACHED */
 }

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h	Fri Dec 13 18:39:36 2019	(r355722)
+++ head/sys/sys/syscallsubr.h	Fri Dec 13 18:44:02 2019	(r355723)
@@ -156,6 +156,7 @@ int	kern_kevent_anonymous(struct thread *td, int neven
 int	kern_kevent_fp(struct thread *td, struct file *fp, int nchanges,
 	    int nevents, struct kevent_copyops *k_ops,
 	    const struct timespec *timeout);
+int	kern_kill(struct thread *td, pid_t pid, int signum);
 int	kern_kqueue(struct thread *td, int flags, struct filecaps *fcaps);
 int	kern_kldload(struct thread *td, const char *file, int *fileid);
 int	kern_kldstat(struct thread *td, int fileid, struct kld_file_stat *stat);


More information about the svn-src-all mailing list