Nmap Development mailing list archives
[PATCH] Redo max_sd() for (hopefully) better results
From: Kris Katterjohn <katterjohn () gmail com>
Date: Sat, 13 Jan 2007 18:26:48 -0600
The attached patch (/nmap-exp/kris SVN r4351) redoes max_sd() (tcpip.cc) so that we can try to get more out of it. The documentation (comments) in the patch and the SVN log below should explain it all. ------------------------------------------------------------------------ r4351 | kris | 2007-01-13 18:19:04 -0600 (Sat, 13 Jan 2007) | 1 line This basically redoes max_sd() (tcpip.cc). If we're root, we attempt to set the limit to RLIM_INFINITY or (if that fails) POSIX _SC_OPEN_MAX (if available). If that fails or we weren't root to begin with, we just set rlim_cur=rlim_max. It's still "experimental" (because I kinda tossed it together), but I don't have any problems with it. Hopefully I can get some feedback from people with other OS's on nmap-dev. ------------------------------------------------------------------------ I'd really appreciate any feedback on it. Thanks, Kris Katterjohn
Index: tcpip.cc
===================================================================
--- tcpip.cc (revision 4350)
+++ tcpip.cc (revision 4351)
@@ -3051,39 +3051,87 @@
}
/* Maximize the open file descriptor limit for this process go up to the
- max allowed */
+ * max allowed. If we're root, we try setting rlim_cur and rlim_max to
+ * RLIM_INFINITY to try to "remove" the limit. Some OS's have a problem
+ * with that, so if that fails we try to set them to the POSIX _SC_OPEN_MAX
+ * (if available and bigger than rlim_max but smaller than RLIM_INFINITY).
+ * If that fails too we resort to rlim_cur=rlim_max. If we're not root we
+ * just do rlim_cur=rlim_max.
+ */
int max_sd() {
#ifndef WIN32
- struct rlimit r;
+ struct rlimit r, sr;
+ int ret = -1;
static int maxfds = -1;
+#ifdef _SC_OPEN_MAX
+ static long openmax = sysconf(_SC_OPEN_MAX);
+#else
+ static long openmax;
+#endif
if (maxfds > 0)
return maxfds;
-#if(defined(RLIMIT_NOFILE))
+ /* if sysconf() failed for some reason */
+ if (openmax == -1)
+ openmax = 0;
+
+#ifdef RLIMIT_NOFILE
+ if (o.isr00t) {
+ sr.rlim_cur = sr.rlim_max = RLIM_INFINITY;
+ ret = setrlimit(RLIMIT_NOFILE, &sr);
+ }
+
+ if (ret && !getrlimit(RLIMIT_NOFILE, &r)) {
+ if (o.isr00t && ((rlim_t) openmax > r.rlim_max) && ((rlim_t) openmax < RLIM_INFINITY)) {
+ sr.rlim_cur = sr.rlim_max = openmax;
+
+ ret = setrlimit(RLIMIT_NOFILE, &sr);
+ }
+
+ if (ret) {
+ r.rlim_cur = r.rlim_max;
+
+ if (setrlimit(RLIMIT_NOFILE, &r))
+ if (o.debugging)
+ perror("setrlimit RLIMIT_NOFILE failed");
+ }
+ }
+
if (!getrlimit(RLIMIT_NOFILE, &r)) {
- r.rlim_cur = r.rlim_max;
- if (setrlimit(RLIMIT_NOFILE, &r))
- if (o.debugging) perror("setrlimit RLIMIT_NOFILE failed");
- if (!getrlimit(RLIMIT_NOFILE, &r)) {
- maxfds = r.rlim_cur;
- return maxfds;
- } else return 0;
+ maxfds = r.rlim_cur;
+ return maxfds;
}
-#endif
-#if(defined(RLIMIT_OFILE) && !defined(RLIMIT_NOFILE))
- if (!getrlimit(RLIMIT_OFILE, &r)) {
- r.rlim_cur = r.rlim_max;
- if (setrlimit(RLIMIT_OFILE, &r))
- if (o.debugging) perror("setrlimit RLIMIT_OFILE failed");
- if (!getrlimit(RLIMIT_OFILE, &r)) {
- maxfds = r.rlim_cur;
- return maxfds;
+#elif defined RLIMIT_OFILE
+ if (o.isr00t) {
+ sr.rlim_cur = sr.rlim_max = RLIM_INFINITY;
+ ret = setrlimit(RLIMIT_OFILE, &sr);
+ }
+
+ if (ret && !getrlimit(RLIMIT_OFILE, &r)) {
+ if (o.isr00t && ((rlim_t) openmax > r.rlim_max) && ((rlim_t) openmax < RLIM_INFINITY)) {
+ sr.rlim_cur = sr.rlim_max = openmax;
+
+ ret = setrlimit(RLIMIT_OFILE, &sr);
}
- else return 0;
+
+ if (ret) {
+ r.rlim_cur = r.rlim_max;
+
+ if (setrlimit(RLIMIT_OFILE, &r))
+ if (o.debugging)
+ perror("setrlimit RLIMIT_OFILE failed");
+ }
}
+
+ if (!getrlimit(RLIMIT_OFILE, &r)) {
+ maxfds = r.rlim_cur;
+ return maxfds;
+ }
#endif
#endif /* WIN32 */
+
+ /* something went wrong */
return 0;
}
_______________________________________________ Sent through the nmap-dev mailing list http://cgi.insecure.org/mailman/listinfo/nmap-dev Archived at http://SecLists.Org
Current thread:
- [PATCH] Redo max_sd() for (hopefully) better results Kris Katterjohn (Jan 13)
