From owner-freebsd-bugs@FreeBSD.ORG Wed Jul 27 10:30:10 2011 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 17C3F1065674 for ; Wed, 27 Jul 2011 10:30:10 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id D407F8FC16 for ; Wed, 27 Jul 2011 10:30:09 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p6RAU9oE043119 for ; Wed, 27 Jul 2011 10:30:09 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p6RAU9B3043118; Wed, 27 Jul 2011 10:30:09 GMT (envelope-from gnats) Resent-Date: Wed, 27 Jul 2011 10:30:09 GMT Resent-Message-Id: <201107271030.p6RAU9B3043118@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, AIDA Shinra Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7EF28106566B for ; Wed, 27 Jul 2011 10:24:28 +0000 (UTC) (envelope-from shinra@sodans.usata.org) Received: from sodans.usata.org (sodans.usata.org [49.212.76.31]) by mx1.freebsd.org (Postfix) with ESMTP id 569F78FC0A for ; Wed, 27 Jul 2011 10:24:28 +0000 (UTC) Received: by sodans.usata.org (Postfix, from userid 1010) id DCE9D119C0C; Wed, 27 Jul 2011 19:24:27 +0900 (JST) Message-Id: <20110727102427.DCE9D119C0C@sodans.usata.org> Date: Wed, 27 Jul 2011 19:24:27 +0900 (JST) From: AIDA Shinra To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: bin/159226: [PATCH] Libedit does not always restore its signal handler X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: AIDA Shinra List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Jul 2011 10:30:10 -0000 >Number: 159226 >Category: bin >Synopsis: [PATCH] Libedit does not always restore its signal handler >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Jul 27 10:30:08 UTC 2011 >Closed-Date: >Last-Modified: >Originator: AIDA Shinra >Release: FreeBSD 7.3-RELEASE-p6 i386 >Organization: >Environment: System: FreeBSD sodans.usata.org 7.3-RELEASE-p6 FreeBSD 7.3-RELEASE-p6 #1: Mon Jun 27 01:58:42 JST 2011 wm3@sodans.usata.org:/usr/obj/usr/src/sys/KERNEL_SODANS i386 >Description: If a program gets the same signal twice in a single call to el_gets(), editline's internal signal handler is not used to the second one. >How-To-Repeat: I found this bug when testing CURRENT's BSD bc. You can also reproduce the problem by inserting "printf" or "write" to libedit's sig_handler() and run ftp(1). >Fix: Apply the attached patch. --- libedit-multisignal.diff begins here --- --- /usr/src/lib/libedit/sig.c 2010-02-10 09:26:20.000000000 +0900 +++ sig.c 2011-07-17 13:31:47.000000000 +0900 @@ -94,9 +94,18 @@ if (signo == sighdl[i]) break; - (void) signal(signo, sel->el_signal[i]); + if (sel->el_signal[i] != SIG_IGN && signo != SIGCONT) { + /* Deliver the signal to my original handler */ + (void) signal(signo, sel->el_signal[i]); + (void) kill(getpid(), signo); + (void) sigfillset(&nset); + (void) sigdelset(&nset, signo); + (void) sigdelset(&nset, SIGCONT); + /* delever and maybe stop here */ + (void) sigsuspend(&nset); + (void) signal(signo, sig_handler); + } (void) sigprocmask(SIG_SETMASK, &oset, NULL); - (void) kill(0, signo); } --- libedit-multisignal.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted: