Bugzilla – Attachment 3307 Details for
Bug 3049
ssh startup time on OSX is linear to _SC_OPEN_MAX
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
attempt #2
bv3049.diff (text/plain), 4.19 KB, created by
Damien Miller
on 2019-08-02 16:42:23 AEST
(
hide
)
Description:
attempt #2
Filename:
MIME Type:
Creator:
Damien Miller
Created:
2019-08-02 16:42:23 AEST
Size:
4.19 KB
patch
obsolete
>commit b0ac8fbc0edea1cf2dfc78df55095757f65ca243 >Author: Damien Miller <djm@mindrot.org> >Date: Fri Aug 2 10:56:36 2019 +1000 > > add proc_fdinfo strategy for closefrom() > > based on patch from likan_999.student@sina.com in bz#3049 > > refactor out fallback brute-force closefrom() implementation and > share it between /proc/pid/fd and proc_fdinfo strategies. > > ok dtucker@ > >diff --git a/configure.ac b/configure.ac >index 1c35b090..8c6c4637 100644 >--- a/configure.ac >+++ b/configure.ac >@@ -679,6 +679,9 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) > AC_CHECK_LIB([sandbox], [sandbox_apply], [ > SSHDLIBS="$SSHDLIBS -lsandbox" > ]) >+ # proc_pidinfo()-based closefrom() replacement. >+ AC_CHECK_HEADERS([libproc.h]) >+ AC_CHECK_FUNCS([proc_pidinfo]) > ;; > *-*-dragonfly*) > SSHDLIBS="$SSHDLIBS -lcrypt" >diff --git a/openbsd-compat/bsd-closefrom.c b/openbsd-compat/bsd-closefrom.c >index b56476a2..12d159ac 100644 >--- a/openbsd-compat/bsd-closefrom.c >+++ b/openbsd-compat/bsd-closefrom.c >@@ -46,6 +46,9 @@ > # include <ndir.h> > # endif > #endif >+#if defined(HAVE_LIBPROC_H) >+# include <libproc.h> >+#endif > > #ifndef OPEN_MAX > # define OPEN_MAX 256 >@@ -55,21 +58,88 @@ > __unused static const char rcsid[] = "$Sudo: closefrom.c,v 1.11 2006/08/17 15:26:54 millert Exp $"; > #endif /* lint */ > >+#ifndef HAVE_FCNTL_CLOSEM > /* > * Close all file descriptors greater than or equal to lowfd. > */ >+static void >+closefrom_fallback(int lowfd) >+{ >+ long fd, maxfd; >+ >+ /* >+ * Fall back on sysconf() or getdtablesize(). We avoid checking >+ * resource limits since it is possible to open a file descriptor >+ * and then drop the rlimit such that it is below the open fd. >+ */ >+#ifdef HAVE_SYSCONF >+ maxfd = sysconf(_SC_OPEN_MAX); >+#else >+ maxfd = getdtablesize(); >+#endif /* HAVE_SYSCONF */ >+ if (maxfd < 0) >+ maxfd = OPEN_MAX; >+ >+ for (fd = lowfd; fd < maxfd; fd++) >+ (void) close((int) fd); >+} >+#endif /* HAVE_FCNTL_CLOSEM */ >+ > #ifdef HAVE_FCNTL_CLOSEM > void > closefrom(int lowfd) > { > (void) fcntl(lowfd, F_CLOSEM, 0); > } >-#else >+#elif defined(HAVE_LIBPROC_H) && defined(HAVE_PROC_PIDINFO) > void > closefrom(int lowfd) > { >- long fd, maxfd; >-#if defined(HAVE_DIRFD) && defined(HAVE_PROC_PID) >+ int i, need, got = 0; >+ pid_t pid = getpid(); >+ struct proc_fdinfo *fdinfo_buf = NULL; >+ >+ /* >+ * Obtain map of open fds. >+ * >+ * Be prepared to retry in case the table size changes between the >+ * size query and the actual attempt to fetch it. >+ */ >+ for (i = 0; i < 2; i++) { >+ /* Obtain size */ >+ need = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, NULL, 0); >+ if (need == 0) >+ return; /* no fds, really? */ >+ else if (need == -1) >+ break; >+ if ((fdinfo_buf = malloc(need)) == NULL) >+ break; >+ got = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, fdinfo_buf, need); >+ if (got >= 0 && got <= need) >+ break; /* success */ >+ free(fdinfo_buf); >+ fdinfo_buf = NULL; >+ if (got == -1) >+ break; >+ /* fd table size increased; retry */ >+ } >+ /* If unable to obtain the fd map, then fall back to brute force */ >+ if (fdinfo_buf == NULL) { >+ closefrom_fallback(lowfd); >+ return >+ } >+ /* Close fds from map */ >+ for (i = 0; i < got / PROC_PIDLISTFD_SIZE; i++) { >+ if (fdinfo_buf[i].proc_fd >= lowfd) >+ close(fdinfo_buf[i].proc_fd); >+ } >+ free(fdinfo_buf); >+} >+#elif defined(HAVE_DIRFD) && defined(HAVE_PROC_PID) >+void >+closefrom(int lowfd) >+{ >+ long fd; > char fdpath[PATH_MAX], *endp; > struct dirent *dent; > DIR *dirp; >@@ -85,25 +155,16 @@ closefrom(int lowfd) > (void) close((int) fd); > } > (void) closedir(dirp); >- } else >-#endif >- { >- /* >- * Fall back on sysconf() or getdtablesize(). We avoid checking >- * resource limits since it is possible to open a file descriptor >- * and then drop the rlimit such that it is below the open fd. >- */ >-#ifdef HAVE_SYSCONF >- maxfd = sysconf(_SC_OPEN_MAX); >-#else >- maxfd = getdtablesize(); >-#endif /* HAVE_SYSCONF */ >- if (maxfd < 0) >- maxfd = OPEN_MAX; >- >- for (fd = lowfd; fd < maxfd; fd++) >- (void) close((int) fd); >+ return; > } >+ /* /proc/$$/fd strategy failed, fall back to brute force closure */ >+ closefrom_fallback(lowfd); >+} >+#else >+void >+closefrom(int lowfd) >+{ >+ closefrom_fallback(lowfd); > } > #endif /* !HAVE_FCNTL_CLOSEM */ > #endif /* HAVE_CLOSEFROM */
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 3049
:
3305
|
3306
|
3307
|
3309