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)))