#endif
#include "sudo_queue.h"
-/* Number of bits in a byte. */
-#ifndef NBBY
-# ifdef __NBBY
-# define NBBY __NBBY
-# else
-# define NBBY 8
-# endif
-#endif
-
-/* Bit map macros. */
-#define sudo_setbit(_a, _i) ((_a)[(_i) / NBBY] |= 1 << ((_i) % NBBY))
-#define sudo_clrbit(_a, _i) ((_a)[(_i) / NBBY] &= ~(1<<((_i) % NBBY)))
-#define sudo_isset(_a, _i) ((_a)[(_i) / NBBY] & (1<<((_i) % NBBY)))
-#define sudo_isclr(_a, _i) (((_a)[(_i) / NBBY] & (1<<((_i) % NBBY))) == 0)
-
/*
* List of debug files and flags for use in registration.
*/
# define mtim_get(_x, _y) do { (_y).tv_sec = (_x)->st_mtime; (_y).tv_nsec = 0; } while (0)
#endif /* HAVE_ST_MTIM */
+/* Bit map macros. */
+#define sudo_setbit(_a, _i) ((_a)[(_i) / NBBY] |= 1 << ((_i) % NBBY))
+#define sudo_clrbit(_a, _i) ((_a)[(_i) / NBBY] &= ~(1<<((_i) % NBBY)))
+#define sudo_isset(_a, _i) ((_a)[(_i) / NBBY] & (1<<((_i) % NBBY)))
+#define sudo_isclr(_a, _i) (((_a)[(_i) / NBBY] & (1<<((_i) % NBBY))) == 0)
+
/*
* Macros to quiet gcc's warn_unused_result attribute.
*/
#include <config.h>
-#include <sys/param.h> /* for howmany() on Linux */
-#ifdef HAVE_SYS_SYSMACROS_H
-# include <sys/sysmacros.h> /* for howmany() on Solaris */
-#endif /* HAVE_SYS_SYSMACROS_H */
-#ifdef HAVE_SYS_SELECT_H
-# include <sys/select.h> /* for FD_* macros */
-#endif /* HAVE_SYS_SELECT_H */
#include <stdio.h>
#include <stdlib.h>
#ifdef HAVE_STRING_H
{
int fd, lastfd = -1;
struct preserved_fd *pfd, *pfd_next;
- fd_set *fdsp;
+ unsigned char *fdbits;
debug_decl(closefrom_except, SUDO_DEBUG_UTIL)
/* First, relocate preserved fds to be as contiguous as possible. */
}
/* Create bitmap of preserved (relocated) fds. */
- fdsp = calloc(howmany(lastfd + 1, NFDBITS), sizeof(fd_mask));
- if (fdsp == NULL)
+ fdbits = calloc((lastfd + NBBY) / NBBY, 1);
+ if (fdbits == NULL)
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
TAILQ_FOREACH(pfd, pfds, entries) {
- FD_SET(pfd->lowfd, fdsp);
+ sudo_setbit(fdbits, pfd->lowfd);
}
/*
* Close any unpreserved fds [startfd,lastfd]
*/
for (fd = startfd; fd <= lastfd; fd++) {
- if (!FD_ISSET(fd, fdsp)) {
+ if (!sudo_isset(fdbits, fd)) {
sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"closing fd %d", fd);
#ifdef __APPLE__
#endif
}
}
- free(fdsp);
+ free(fdbits);
/* Let closefrom() do the rest for us. */
if (lastfd + 1 > startfd)