diff --git a/GNUmakefile b/GNUmakefile index 5cca2fb..2574536 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -381,10 +381,10 @@ ifndef MAKE_RESTARTS $(info ------------------------------------------------------------------------------) $(info $(PNAME) $(VERSION)) $(info ------------------------------------------------------------------------------) -$(info Report bugs at https://github.com/droe/sslsplit/issues/new) +$(info Report bugs at https://github.com/sonertari/SSLproxy/issues/new) $(info Please supply this header for diagnostics when reporting build issues) $(info Before reporting bugs, make sure to try the latest develop branch first:) -$(info % git clone -b develop https://github.com/droe/sslsplit.git) +$(info % git clone -b develop https://github.com/sonertari/SSLproxy.git) $(info ------------------------------------------------------------------------------) $(info Via pkg-config: $(strip $(PKGS) $(TPKGS))) ifdef OPENSSL_FOUND diff --git a/pxyconn.c b/pxyconn.c index 8c0ce10..dbb13cc 100644 --- a/pxyconn.c +++ b/pxyconn.c @@ -64,6 +64,9 @@ #include #include +#ifdef HAVE_NETFILTER +#include +#endif /* HAVE_NETFILTER */ /* * Maximum size of data to buffer per connection direction before @@ -3587,6 +3590,29 @@ pxy_fd_readcb(MAYBE_UNUSED evutil_socket_t fd, UNUSED short what, void *arg) pxy_conn_connect(ctx); } +#ifdef HAVE_NETFILTER +/* + * Copied from: + * https://github.com/tmux/tmux/blob/master/compat/getdtablecount.c + */ +int +getdtablecount(void) +{ + char path[PATH_MAX]; + glob_t g; + int n = 0; + + if (snprintf(path, sizeof path, "/proc/%ld/fd/*", (long)getpid()) < 0) { + log_err_level_printf(LOG_CRIT, "snprintf overflow\n"); + return 0; + } + if (glob(path, 0, NULL, &g) == 0) + n = g.gl_pathc; + globfree(&g); + return n; +} +#endif /* HAVE_NETFILTER */ + /* * Callback for accept events on the socket listener bufferevent. * Called when a new incoming connection has been accepted. @@ -3605,6 +3631,8 @@ pxy_conn_setup(evutil_socket_t fd, proxyspec_t *spec, opts_t *opts, evutil_socket_t clisock) { + int dtable_count = getdtablecount(); + #ifdef DEBUG_PROXY log_dbg_level_printf(LOG_DBG_MODE_FINEST, "pxy_conn_setup: ENTER fd=%d\n", fd); @@ -3615,11 +3643,11 @@ pxy_conn_setup(evutil_socket_t fd, free(port); } - log_dbg_level_printf(LOG_DBG_MODE_FINEST, "pxy_conn_setup: descriptor_table_size=%d, current fd count=%d, reserve=%d\n", descriptor_table_size, getdtablecount(), FD_RESERVE); + log_dbg_level_printf(LOG_DBG_MODE_FINEST, "pxy_conn_setup: descriptor_table_size=%d, current fd count=%d, reserve=%d\n", descriptor_table_size, dtable_count, FD_RESERVE); #endif /* DEBUG_PROXY */ // Close the conn if we are out of file descriptors, or libevent will crash us - if (getdtablecount() + FD_RESERVE >= descriptor_table_size) { + if (dtable_count + FD_RESERVE >= descriptor_table_size) { errno = EMFILE; log_err_level_printf(LOG_CRIT, "Out of file descriptors\n"); evutil_closesocket(fd);