Use our own bitmap macros instead of borrowing the ones from select.

This commit is contained in:
Todd C. Miller
2015-06-23 16:37:00 -06:00
parent 7b086b6842
commit a76b93e23a
4 changed files with 21 additions and 28 deletions

View File

@@ -297,6 +297,15 @@ extern int errno;
# define WCOREDUMP(x) ((x) & 0x80) # define WCOREDUMP(x) ((x) & 0x80)
#endif #endif
/* Number of bits in a byte. */
#ifndef NBBY
# ifdef __NBBY
# define NBBY __NBBY
# else
# define NBBY 8
# endif
#endif
#ifndef HAVE_SETEUID #ifndef HAVE_SETEUID
# if defined(HAVE_SETRESUID) # if defined(HAVE_SETRESUID)
# define seteuid(u) setresuid(-1, (u), -1) # define seteuid(u) setresuid(-1, (u), -1)

View File

@@ -25,21 +25,6 @@
#endif #endif
#include "sudo_queue.h" #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. * List of debug files and flags for use in registration.
*/ */

View File

@@ -132,6 +132,12 @@
# define mtim_get(_x, _y) do { (_y).tv_sec = (_x)->st_mtime; (_y).tv_nsec = 0; } while (0) # define mtim_get(_x, _y) do { (_y).tv_sec = (_x)->st_mtime; (_y).tv_nsec = 0; } while (0)
#endif /* HAVE_ST_MTIM */ #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. * Macros to quiet gcc's warn_unused_result attribute.
*/ */

View File

@@ -16,13 +16,6 @@
#include <config.h> #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 <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef HAVE_STRING_H #ifdef HAVE_STRING_H
@@ -93,7 +86,7 @@ closefrom_except(int startfd, struct preserved_fd_list *pfds)
{ {
int fd, lastfd = -1; int fd, lastfd = -1;
struct preserved_fd *pfd, *pfd_next; struct preserved_fd *pfd, *pfd_next;
fd_set *fdsp; unsigned char *fdbits;
debug_decl(closefrom_except, SUDO_DEBUG_UTIL) debug_decl(closefrom_except, SUDO_DEBUG_UTIL)
/* First, relocate preserved fds to be as contiguous as possible. */ /* First, relocate preserved fds to be as contiguous as possible. */
@@ -132,18 +125,18 @@ closefrom_except(int startfd, struct preserved_fd_list *pfds)
} }
/* Create bitmap of preserved (relocated) fds. */ /* Create bitmap of preserved (relocated) fds. */
fdsp = calloc(howmany(lastfd + 1, NFDBITS), sizeof(fd_mask)); fdbits = calloc((lastfd + NBBY) / NBBY, 1);
if (fdsp == NULL) if (fdbits == NULL)
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
TAILQ_FOREACH(pfd, pfds, entries) { TAILQ_FOREACH(pfd, pfds, entries) {
FD_SET(pfd->lowfd, fdsp); sudo_setbit(fdbits, pfd->lowfd);
} }
/* /*
* Close any unpreserved fds [startfd,lastfd] * Close any unpreserved fds [startfd,lastfd]
*/ */
for (fd = startfd; fd <= lastfd; fd++) { 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, sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
"closing fd %d", fd); "closing fd %d", fd);
#ifdef __APPLE__ #ifdef __APPLE__
@@ -154,7 +147,7 @@ closefrom_except(int startfd, struct preserved_fd_list *pfds)
#endif #endif
} }
} }
free(fdsp); free(fdbits);
/* Let closefrom() do the rest for us. */ /* Let closefrom() do the rest for us. */
if (lastfd + 1 > startfd) if (lastfd + 1 > startfd)