From owner-svn-src-head@FreeBSD.ORG Wed Apr 8 15:56:51 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8E2DD1065675; Wed, 8 Apr 2009 15:56:51 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7C42D8FC19; Wed, 8 Apr 2009 15:56:51 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n38Fupfi063808; Wed, 8 Apr 2009 15:56:51 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n38FupRY063807; Wed, 8 Apr 2009 15:56:51 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <200904081556.n38FupRY063807@svn.freebsd.org> From: Ed Schouten Date: Wed, 8 Apr 2009 15:56:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r190847 - head/sys/kern X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Apr 2009 15:56:52 -0000 Author: ed Date: Wed Apr 8 15:56:50 2009 New Revision: 190847 URL: http://svn.freebsd.org/changeset/base/190847 Log: Fix tty_wait_background() to comply with standards. It turns out my handling of SIGTTOU and SIGTTIN didn't entirely comply to the standards. It is true that in the SIGTTOU case we should not return EIO when the signal is ignored/blocked, but in the SIGTTIN case we must. See also: POSIX issue 7 section 11.1.4 Modified: head/sys/kern/tty.c Modified: head/sys/kern/tty.c ============================================================================== --- head/sys/kern/tty.c Wed Apr 8 15:18:21 2009 (r190846) +++ head/sys/kern/tty.c Wed Apr 8 15:56:50 2009 (r190847) @@ -371,23 +371,31 @@ tty_wait_background(struct tty *tp, stru * exit * - the signal to send to the process isn't masked */ - if (!tty_is_ctty(tp, p) || - p->p_pgrp == tp->t_pgrp || p->p_flag & P_PPWAIT || - SIGISMEMBER(p->p_sigacts->ps_sigignore, sig) || - SIGISMEMBER(td->td_sigmask, sig)) { + if (!tty_is_ctty(tp, p) || p->p_pgrp == tp->t_pgrp) { /* Allow the action to happen. */ PROC_UNLOCK(p); return (0); } + if (SIGISMEMBER(p->p_sigacts->ps_sigignore, sig) || + SIGISMEMBER(td->td_sigmask, sig)) { + /* Only allow them in write()/ioctl(). */ + PROC_UNLOCK(p); + return (sig == SIGTTOU ? 0 : EIO); + } + + pg = p->p_pgrp; + if (p->p_flag & P_PPWAIT || pg->pg_jobc == 0) { + /* Don't allow the action to happen. */ + PROC_UNLOCK(p); + return (EIO); + } + PROC_UNLOCK(p); + /* * Send the signal and sleep until we're the new * foreground process group. */ - pg = p->p_pgrp; - PROC_UNLOCK(p); - if (pg->pg_jobc == 0) - return (EIO); PGRP_LOCK(pg); pgsignal(pg, sig, 1); PGRP_UNLOCK(pg);