3.13. Preventing File Descriptor Overflows When Using select( )
Problem
Your program uses the
select( )
system call to determine when sockets
are ready for writing, have data waiting to be read, or have an
exceptional condition (e.g., out-of-band data has arrived). Using
select( )
requires the use of the
fd_set
data type, which typically entails the use
of the FD_*( )
family of macros. In most
implementations, FD_SET( )
and FD_CLR(
)
, in particular, are susceptible to an array overrun.
Solution
Do not use the FD_*( )
family of macros. Instead,
use the macros that are provided in this recipe. The FD_SET(
)
and FD_CLR( )
macros will modify an
fd_set
object without performing any bounds
checking. The macros we provide will do proper bounds checking.
Discussion
The select( )
system
call is normally used to multiplex sockets. In a single-threaded
environment, select( )
allows you to build sets of
socket descriptors for which you wish to wait for data to become
available or that you wish to have available to write data to. The
fd_set
data type is used to hold a list of the
socket descriptors, and several standard macros are used to
manipulate objects of this type.
Normally, fd_set
is defined as a structure with a
single member that is a statically allocated array of long integers.
Because socket descriptors are always numbered starting with 0 and
ending with the highest allowable descriptor, the array of integers
in an fd_set
is actually treated as a bitmask with a one-to-one correspondence ...
Get Secure Programming Cookbook for C and C++ now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.