Subject: Bug in FD_ISSET/FD_CLR/FD_SET?
To: None <current-users@netbsd.org>
From: Ted Lemon <mellon@isc.org>
List: current-users
Date: 09/08/1999 19:45:09
It seems to me that these macros are broken because they don't
bounds-check the descriptor number.   I've included a proposed
change.   Does anybody object (modulo compile errors, for which I have
not yet tested)?

			       _MelloN_

Index: types.h
===================================================================
RCS file: /cvsroot/syssrc/sys/sys/types.h,v
retrieving revision 1.37
diff -c -r1.37 types.h
*** types.h	1999/03/14 01:24:18	1.37
--- types.h	1999/09/09 02:43:25
***************
*** 175,183 ****
  	fd_mask	fds_bits[howmany(FD_SETSIZE, NFDBITS)];
  } fd_set;
  
! #define	FD_SET(n, p)	((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
! #define	FD_CLR(n, p)	((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
! #define	FD_ISSET(n, p)	((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
  #define	FD_COPY(f, t)	(void)memcpy((t), (f), sizeof(*(f)))
  #define	FD_ZERO(p)	(void)memset((p), 0, sizeof(*(p)))
  
--- 175,189 ----
  	fd_mask	fds_bits[howmany(FD_SETSIZE, NFDBITS)];
  } fd_set;
  
! #define	FD_SET(n, p)	(((n) >= 0 && (n) < FD_SETSIZE) \
! 		 ? ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) \
! 		 : 0)
! #define	FD_CLR(n, p)	(((n) >= 0 && (n) < FD_SETSIZE) \
! 		 ? ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) \
! 		 : 0)
! #define	FD_ISSET(n, p)	(((n) >= 0 && (n) < FD_SETSIZE) \
! 		 ? ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) \
! 		 : 0)
  #define	FD_COPY(f, t)	(void)memcpy((t), (f), sizeof(*(f)))
  #define	FD_ZERO(p)	(void)memset((p), 0, sizeof(*(p)))