bin/78304: Signal handler abuse in comsat(8)

Gavin Atkinson gavin.atkinson at ury.york.ac.uk
Wed Mar 2 18:40:04 GMT 2005


The following reply was made to PR bin/78304; it has been noted by GNATS.

From: Gavin Atkinson <gavin.atkinson at ury.york.ac.uk>
To: FreeBSD-gnats-submit at FreeBSD.org, freebsd-bugs at FreeBSD.org
Cc:  
Subject: Re: bin/78304: Signal handler abuse in comsat(8)
Date: Wed, 2 Mar 2005 18:37:44 +0000 (GMT)

 Sorry, attached an earlier version of the patch by mistake.
 
 Copy of it at http://www.devrandom.co.uk/freebsd/comsat-sigs.patch incase
 my mail reader has mangled this copy.
 
 Gavin
 
 --- comsat-sigs.patch begins here ---
 Index: src/libexec/comsat/comsat.c
 ===================================================================
 RCS file: /usr/cvs/src/libexec/comsat/comsat.c,v
 retrieving revision 1.17
 diff -u -r1.17 comsat.c
 --- src/libexec/comsat/comsat.c	14 Feb 2005 17:42:56 -0000	1.17
 +++ src/libexec/comsat/comsat.c	28 Feb 2005 00:07:10 -0000
 @@ -77,11 +77,13 @@
  struct	utmp *utmp = NULL;
  time_t	lastmsgtime;
  int	nutmp, uf;
 +volatile sig_atomic_t needreadutmp = 0;
 
  void jkfprintf(FILE *, char[], char[], off_t);
  void mailfor(char *);
  void notify(struct utmp *, char[], off_t, int);
  void onalrm(int);
 +void readutmp(void);
  void reapchildren(int);
 
  int
 @@ -109,11 +111,16 @@
  	}
  	(void)time(&lastmsgtime);
  	(void)gethostname(hostname, sizeof(hostname));
 -	onalrm(0);
 +	readutmp();
  	(void)signal(SIGALRM, onalrm);
  	(void)signal(SIGTTOU, SIG_IGN);
  	(void)signal(SIGCHLD, reapchildren);
  	for (;;) {
 +		if (needreadutmp) {
 +			needreadutmp = 0;
 +			readutmp();
 +		}
 +
  		cc = recv(0, msgbuf, sizeof(msgbuf) - 1, 0);
  		if (cc <= 0) {
  			if (errno != EINTR)
 @@ -134,12 +141,22 @@
  void
  reapchildren(int signo)
  {
 -	while (wait3(NULL, WNOHANG, NULL) > 0);
 +	int save_errno = errno;
 +
 +	while (wait3(NULL, WNOHANG, NULL) > 0)
 +		;
 +	errno = save_errno;
  }
 
  void
  onalrm(int signo)
  {
 +	needreadutmp = 1;
 +}
 +
 +void
 +readutmp(void)
 +{
  	static u_int utmpsize;		/* last malloced size for utmp */
  	static u_int utmpmtime;		/* last modification time for utmp */
  	struct stat statbf;
 --- comsat-sigs.patch ends here ---
 


More information about the freebsd-bugs mailing list