On Wed, Jan 21, 2009 at 02:20:16AM +0100, Lars Kruse wrote:
Hi,
starting with v4.21, stunnel does not disconnect from the terminal anymore. This can cause problems, if the caller does not redirect stdout/stderr to /dev/null. This did not happen with v4.20.
does anybody have any comments on this?
The following patch fixes the issue, but I think it's too heavy handed, daemonizing each libwrap process by itself to get it detached and thus putting each in its own process group. It confirms the diagnostic that this is caused by those processes remaining attached to the terminal, at least.
---------------------------------------------------------------------- diff --git a/src/libwrap.c b/src/libwrap.c index b71fd28..7924eb3 100644 --- a/src/libwrap.c +++ b/src/libwrap.c @@ -80,6 +80,7 @@ void libwrap_init(int num) { die(1); case 0: /* child */ drop_privileges(); /* libwrap processes are not chrooted */ + daemonize(); /* detach from terminal */ /* FIXME: other file descriptors are not closed */ close(ipc_socket[2*i]); /* server-side socket */ for(j=0; j<i; ++j) /* previously created client-side sockets */ diff --git a/src/prototypes.h b/src/prototypes.h index e0efabd..fad8c59 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -76,6 +76,9 @@ void main_execute(void); #if !defined (USE_WIN32) && !defined (__vms) && !defined(USE_OS2) void drop_privileges(void); #endif +#if !defined (USE_WIN32) && !defined (__vms) +void daemonize(void); +#endif void stunnel_info(int); void die(int);
diff --git a/src/stunnel.c b/src/stunnel.c index 9d18782..86df5ab 100644 --- a/src/stunnel.c +++ b/src/stunnel.c @@ -44,7 +44,6 @@ static void accept_connection(LOCAL_OPTIONS *); static void get_limits(void); /* setup global max_clients and max_fds */ #if !defined (USE_WIN32) && !defined (__vms) static void change_root(void); -static void daemonize(void); static void create_pid(void); static void delete_pid(void); #endif @@ -347,7 +346,7 @@ void drop_privileges(void) { } }
-static void daemonize(void) { /* go to background */ +void daemonize(void) { /* go to background */ #if defined(HAVE_DAEMON) && !defined(__BEOS__) if(daemon(0, 0)==-1) { ioerror("daemon"); ----------------------------------------------------------------------