From ga9@buffy.york.ac.uk  Sun Feb 27 23:45:21 2005
Return-Path: <ga9@buffy.york.ac.uk>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id BD13516A4CE
	for <FreeBSD-gnats-submit@freebsd.org>; 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 <FreeBSD-gnats-submit@freebsd.org>; 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 <FreeBSD-gnats-submit@freebsd.org>; 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 <FreeBSD-gnats-submit@freebsd.org>; 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 <gavin.atkinson@ury.york.ac.uk>
Reply-To: Gavin Atkinson <gavin.atkinson@ury.york.ac.uk>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [patch] Fix signal handler in bootpd
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         78170
>Category:       bin
>Synopsis:       [patch] Fix signal handler in bootpd(8)
>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:  Sat May 24 23:09:13 UTC 2008
>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:
