Deleted Added
full compact
30c30
< __FBSDID("$FreeBSD: head/sys/compat/linux/linux_signal.c 165869 2007-01-07 19:14:06Z netchild $");
---
> __FBSDID("$FreeBSD: head/sys/compat/linux/linux_signal.c 184058 2008-10-19 10:02:26Z kib $");
41a42,43
> #include <security/audit/audit.h>
>
538,539c540,541
< int
< linux_tgkill(struct thread *td, struct linux_tgkill_args *args)
---
> static int
> linux_do_tkill(struct thread *td, l_int tgid, l_int pid, l_int signum)
541,542c543,544
< struct linux_emuldata *em;
< struct linux_kill_args ka;
---
> struct proc *proc = td->td_proc;
> struct linux_emuldata *em;
543a546,547
> ksiginfo_t ksi;
> int error;
545,548c549,550
< #ifdef DEBUG
< if (ldebug(tgkill))
< printf(ARGS(tgkill, "%d, %d, %d"), args->tgid, args->pid, args->sig);
< #endif
---
> AUDIT_ARG(signum, signum);
> AUDIT_ARG(pid, pid);
550,551c552,556
< ka.pid = args->pid;
< ka.signum = args->sig;
---
> /*
> * Allow signal 0 as a means to check for privileges
> */
> if (!LINUX_SIG_VALID(signum) && signum != 0)
> return (EINVAL);
553,554c558,559
< if (args->tgid == -1)
< return linux_kill(td, &ka);
---
> if (signum > 0 && signum <= LINUX_SIGTBLSZ)
> signum = linux_to_bsd_signal[_SIG_IDX(signum)];
556,557c561,564
< if ((p = pfind(args->pid)) == NULL)
< return ESRCH;
---
> if ((p = pfind(pid)) == NULL) {
> if ((p = zpfind(pid)) == NULL)
> return (ESRCH);
> }
559,560c566,569
< if (p->p_sysent != &elf_linux_sysvec)
< return ESRCH;
---
> AUDIT_ARG(process, p);
> error = p_cansignal(td, p, signum);
> if (error)
> goto out;
562,563c571
< PROC_UNLOCK(p);
<
---
> error = ESRCH;
568c576
< printf("emuldata not found in tgkill.\n");
---
> printf("emuldata not found in do_tkill.\n");
570c578
< return ESRCH;
---
> goto out;
571a580,581
> if (tgid > 0 && em->shared->group_pid != tgid)
> goto out;
573,574c583,588
< if (em->shared->group_pid != args->tgid)
< return ESRCH;
---
> ksiginfo_init(&ksi);
> ksi.ksi_signo = signum;
> ksi.ksi_code = LINUX_SI_TKILL;
> ksi.ksi_errno = 0;
> ksi.ksi_pid = proc->p_pid;
> ksi.ksi_uid = proc->p_ucred->cr_ruid;
576c590,594
< return linux_kill(td, &ka);
---
> error = tdsignal(p, NULL, ksi.ksi_signo, &ksi);
>
> out:
> PROC_UNLOCK(p);
> return (error);
579a598,611
> linux_tgkill(struct thread *td, struct linux_tgkill_args *args)
> {
>
> #ifdef DEBUG
> if (ldebug(tgkill))
> printf(ARGS(tgkill, "%d, %d, %d"), args->tgid, args->pid, args->sig);
> #endif
> if (args->pid <= 0 || args->tgid <=0)
> return (EINVAL);
>
> return (linux_do_tkill(td, args->tgid, args->pid, args->sig));
> }
>
> int
585a618,619
> if (args->tid <= 0)
> return (EINVAL);
587c621
< return (linux_kill(td, (struct linux_kill_args *) args));
---
> return (linux_do_tkill(td, 0, args->tid, args->sig));
588a623,653
>
> void
> ksiginfo_to_lsiginfo(ksiginfo_t *ksi, l_siginfo_t *lsi, l_int sig)
> {
>
> lsi->lsi_signo = sig;
> lsi->lsi_code = ksi->ksi_code;
>
> switch (sig) {
> case LINUX_SIGPOLL:
> /* XXX si_fd? */
> lsi->lsi_band = ksi->ksi_band;
> break;
> case LINUX_SIGCHLD:
> lsi->lsi_pid = ksi->ksi_pid;
> lsi->lsi_uid = ksi->ksi_uid;
> lsi->lsi_status = ksi->ksi_status;
> break;
> case LINUX_SIGBUS:
> case LINUX_SIGILL:
> case LINUX_SIGFPE:
> case LINUX_SIGSEGV:
> lsi->lsi_addr = PTROUT(ksi->ksi_addr);
> break;
> default:
> /* XXX SI_TIMER etc... */
> lsi->lsi_pid = ksi->ksi_pid;
> lsi->lsi_uid = ksi->ksi_uid;
> break;
> }
> }