--- embedaddon/sudo/compat/closefrom.c 2012/02/21 16:23:02 1.1.1.1 +++ embedaddon/sudo/compat/closefrom.c 2013/07/22 10:46:11 1.1.1.2 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2005, 2007, 2010 + * Copyright (c) 2004-2005, 2007, 2010, 2012-2013 * Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any @@ -17,8 +17,9 @@ #include +#ifndef HAVE_CLOSEFROM + #include -#include #include #include #ifdef STDC_HEADERS @@ -30,21 +31,26 @@ # endif #endif /* STDC_HEADERS */ #include -#ifdef HAVE_DIRENT_H -# include -# define NAMLEN(dirent) strlen((dirent)->d_name) +#ifdef HAVE_PSTAT_GETPROC +# include +# include #else -# define dirent direct -# define NAMLEN(dirent) (dirent)->d_namlen -# ifdef HAVE_SYS_NDIR_H -# include +# ifdef HAVE_DIRENT_H +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# ifdef HAVE_SYS_NDIR_H +# include +# endif +# ifdef HAVE_SYS_DIR_H +# include +# endif +# ifdef HAVE_NDIR_H +# include +# endif # endif -# ifdef HAVE_SYS_DIR_H -# include -# endif -# ifdef HAVE_NDIR_H -# include -# endif #endif #include "missing.h" @@ -85,18 +91,31 @@ closefrom_fallback(int lowfd) * Close all file descriptors greater than or equal to lowfd. * We try the fast way first, falling back on the slow method. */ -#ifdef HAVE_FCNTL_CLOSEM +#if defined(HAVE_FCNTL_CLOSEM) void closefrom(int lowfd) { if (fcntl(lowfd, F_CLOSEM, 0) == -1) closefrom_fallback(lowfd); } -#else -# ifdef HAVE_DIRFD +#elif defined(HAVE_PSTAT_GETPROC) void closefrom(int lowfd) { + struct pst_status pstat; + int fd; + + if (pstat_getproc(&pstat, sizeof(pstat), 0, getpid()) != -1) { + for (fd = lowfd; fd <= pstat.pst_highestfd; fd++) + (void) close(fd); + } else { + closefrom_fallback(lowfd); + } +} +#elif defined(HAVE_DIRFD) +void +closefrom(int lowfd) +{ struct dirent *dent; DIR *dirp; char *endp; @@ -114,5 +133,5 @@ closefrom(int lowfd) } else closefrom_fallback(lowfd); } -#endif /* HAVE_DIRFD */ #endif /* HAVE_FCNTL_CLOSEM */ +#endif /* HAVE_CLOSEFROM */