From owner-freebsd-bugs@FreeBSD.ORG Sun Feb 27 23:50:12 2005 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id ABF0F16A4CE for ; Sun, 27 Feb 2005 23:50:12 +0000 (GMT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 73E8743D5A for ; Sun, 27 Feb 2005 23:50:12 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.1/8.13.1) with ESMTP id j1RNoCe8077984 for ; Sun, 27 Feb 2005 23:50:12 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.1/8.13.1/Submit) id j1RNoCO1077982; Sun, 27 Feb 2005 23:50:12 GMT (envelope-from gnats) Resent-Date: Sun, 27 Feb 2005 23:50:12 GMT Resent-Message-Id: <200502272350.j1RNoCO1077982@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, Gavin Atkinson Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id BD13516A4CE for ; Sun, 27 Feb 2005 23:45:21 +0000 (GMT) Received: from mail-gw1.york.ac.uk (mail-gw1.york.ac.uk [144.32.128.246]) by mx1.FreeBSD.org (Postfix) with ESMTP id D3D4343D31 for ; Sun, 27 Feb 2005 23:45:20 +0000 (GMT) (envelope-from ga9@buffy.york.ac.uk) Received: from buffy.york.ac.uk (buffy.york.ac.uk [144.32.226.160]) by mail-gw1.york.ac.uk (8.12.10/8.12.10) with ESMTP id j1RNjID7013120 for ; Sun, 27 Feb 2005 23:45:18 GMT Received: from buffy.york.ac.uk (localhost [127.0.0.1]) by buffy.york.ac.uk (8.13.1/8.13.1) with ESMTP id j1RNjIAP069709 for ; Sun, 27 Feb 2005 23:45:18 GMT (envelope-from ga9@buffy.york.ac.uk) Received: (from ga9@localhost) by buffy.york.ac.uk (8.13.1/8.13.1/Submit) id j1RNjINn069708; Sun, 27 Feb 2005 23:45:18 GMT (envelope-from ga9) Message-Id: <200502272345.j1RNjINn069708@buffy.york.ac.uk> Date: Sun, 27 Feb 2005 23:45:18 GMT From: Gavin Atkinson To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: bin/78170: [patch] Fix signal handler in bootpd X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Gavin Atkinson List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Feb 2005 23:50:12 -0000 >Number: 78170 >Category: bin >Synopsis: [patch] Fix signal handler in bootpd >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Feb 27 23:50:12 GMT 2005 >Closed-Date: >Last-Modified: >Originator: Gavin Atkinson >Release: FreeBSD 5.3-STABLE i386 >Organization: >Environment: System: FreeBSD buffy.york.ac.uk 5.3-STABLE FreeBSD 5.3-STABLE #0: Sat Feb 12 20:42:16 GMT 2005 root@buffy.york.ac.uk:/usr/obj/usr/src/sys/BUFFY i386 >Description: I've been inspired by the talk given by Henning Brauer given at the UKUUG Winter 2005 on writing safe signal handlers, and have set about fixing some of them in the FreeBSD source tree. Slides for this (well, an almost identical) presentation are at http://www.openbsd.org/papers/opencon04/index.html >How-To-Repeat: N/A >Fix: The fix involves using a data type that can be used atomically (sig_atomic_t), and saving errno over calls to other system calls. --- bootpd-sigs.patch begins here --- Index: src/libexec/bootpd/bootpd.c =================================================================== RCS file: /usr/cvs/src/libexec/bootpd/bootpd.c,v retrieving revision 1.23 diff -u -r1.23 bootpd.c --- src/libexec/bootpd/bootpd.c 14 Feb 2005 17:42:56 -0000 1.23 +++ src/libexec/bootpd/bootpd.c 27 Feb 2005 23:03:25 -0000 @@ -158,8 +158,8 @@ static char default_hostname[MAXHOSTNAMELEN]; /* Flags set by signal catcher. */ -PRIVATE int do_readtab = 0; -PRIVATE int do_dumptab = 0; +PRIVATE volatile sig_atomic_t do_readtab = 0; +PRIVATE volatile sig_atomic_t do_dumptab = 0; /* * Globals below are associated with the bootp database file (bootptab). @@ -598,6 +598,10 @@ catcher(sig) int sig; { +#if !defined(SA_NOCLDSTOP) && defined(SYSV) + int save_errno = errno; +#endif + if (sig == SIGHUP) do_readtab = 1; if (sig == SIGUSR1) @@ -605,6 +609,7 @@ #if !defined(SA_NOCLDSTOP) && defined(SYSV) /* For older "System V" derivatives with no sigaction(). */ signal(sig, catcher); + errno = save_errno; #endif } --- bootpd-sigs.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted: