]> granicus.if.org Git - sudo/commitdiff
Use our own bitmap macros instead of borrowing the ones from select.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 23 Jun 2015 22:37:00 +0000 (16:37 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 23 Jun 2015 22:37:00 +0000 (16:37 -0600)
include/sudo_compat.h
include/sudo_debug.h
include/sudo_util.h
src/preserve_fds.c

index c41cc074032b20601dfe63fc26505fe078378a9a..6d9dae404841421b1459aa0b104c01dbe3f4c0dd 100644 (file)
@@ -297,6 +297,15 @@ extern int errno;
 # define WCOREDUMP(x)  ((x) & 0x80)
 #endif
 
+/* Number of bits in a byte. */
+#ifndef NBBY
+# ifdef __NBBY
+#  define NBBY __NBBY
+# else
+#  define NBBY 8
+# endif
+#endif
+
 #ifndef HAVE_SETEUID
 #  if defined(HAVE_SETRESUID)
 #    define seteuid(u) setresuid(-1, (u), -1)
index 15494ec6885c1e6df7a7e971976c45c5f49dc537..70619f1c939b76aab5dfe7376c6e6edb06411fb3 100644 (file)
 #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.
  */
index f49e4d69b391e0dac12c4e408869b1a185b4a4e8..89c9f89f5e36a56c8bb618da1d60271cb3a749d8 100644 (file)
 # 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.
  */
index d0ab439e81784d3177d7534c372952298312da54..00c73e29de32bc93dfaff48ad367a1ac5757af52 100644 (file)
 
 #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
@@ -93,7 +86,7 @@ closefrom_except(int startfd, struct preserved_fd_list *pfds)
 {
     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.  */
@@ -132,18 +125,18 @@ closefrom_except(int startfd, struct preserved_fd_list *pfds)
     }
 
     /* 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__
@@ -154,7 +147,7 @@ closefrom_except(int startfd, struct preserved_fd_list *pfds)
 #endif
        }
     }
-    free(fdsp);
+    free(fdbits);
 
     /* Let closefrom() do the rest for us. */
     if (lastfd + 1 > startfd)