in_k, out_k);
}
- /* Kill possibly running subprocess */
- if (Proc_InProgress(&My_Connections[Idx].proc_stat))
- Proc_Kill(&My_Connections[Idx].proc_stat);
-
/* Servers: Modify time of next connect attempt? */
Conf_UnsetServer( Idx );
return DISCONNECTED;
}
- pid = Proc_Fork(Conn_GetProcStat(conn), pipefd, cb_Read_Auth_Result);
+ /* Fork child process for PAM authentication; and make sure that the
+ * process timeout is set higher than the login timeout! */
+ pid = Proc_Fork(Conn_GetProcStat(conn), pipefd,
+ cb_Read_Auth_Result, Conf_PongTimeout + 1);
if (pid > 0) {
LogDebug("Authenticator for connection %d created (PID %d).",
conn, pid);
#include "log.h"
#include "io.h"
+#include "conn.h"
#include "exp.h"
#include "proc.h"
* Fork a child process.
*/
GLOBAL pid_t
-Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short))
+Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout)
{
pid_t pid;
case 0:
/* New child process: */
signal(SIGTERM, Proc_GenericSignalHandler);
+ signal(SIGALRM, Proc_GenericSignalHandler);
close(pipefds[0]);
+ alarm(timeout);
+ Conn_CloseAllSockets();
return 0;
}
return pid;
}
-/**
- * Kill forked child process.
- */
-GLOBAL void
-Proc_Kill(PROC_STAT *proc)
-{
- assert(proc != NULL);
-
- if (proc->pipe_fd > 0)
- io_close(proc->pipe_fd);
- if (proc->pid > 0)
- kill(proc->pid, SIGTERM);
- Proc_InitStruct(proc);
-}
-
/**
* Generic signal handler for forked child processes.
*/
case SIGTERM:
#ifdef DEBUG
Log_Subprocess(LOG_DEBUG, "Child got TERM signal, exiting.");
+#endif
+ exit(1);
+ case SIGALRM:
+#ifdef DEBUG
+ Log_Subprocess(LOG_DEBUG, "Child got ALARM signal, exiting.");
#endif
exit(1);
}
/**
* Read bytes from a pipe of a forked child process.
- * In addition, this function makes sure that the child process is dead
+ * In addition, this function makes sure that the child process is ignored
* after all data has been read or a fatal error occurred.
*/
GLOBAL size_t
else if (bytes_read == 0)
LogDebug("Can't read from child process %ld: EOF", proc->pid);
#endif
- Proc_Kill(proc);
+ Proc_InitStruct(proc);
return (size_t)bytes_read;
}
GLOBAL void Proc_InitStruct PARAMS((PROC_STAT *proc));
GLOBAL pid_t Proc_Fork PARAMS((PROC_STAT *proc, int *pipefds,
- void (*cbfunc)(int, short)));
-
-GLOBAL void Proc_Kill PARAMS((PROC_STAT *proc));
+ void (*cbfunc)(int, short), int timeout));
GLOBAL void Proc_GenericSignalHandler PARAMS((int Signal));
*/
+#define RESOLVER_TIMEOUT (Conf_PongTimeout*3)/4
+
#include "portab.h"
#include "imp.h"
#include "array.h"
#include "conn.h"
+#include "conf.h"
#include "defines.h"
#include "log.h"
#include "ng_ipaddr.h"
assert(s != NULL);
- pid = Proc_Fork(s, pipefd, cbfunc);
+ pid = Proc_Fork(s, pipefd, cbfunc, RESOLVER_TIMEOUT);
if (pid > 0) {
LogDebug("Resolver for %s created (PID %d).", ng_ipaddr_tostr(Addr), pid);
return true;
assert(s != NULL);
- pid = Proc_Fork(s, pipefd, cbfunc);
+ pid = Proc_Fork(s, pipefd, cbfunc, RESOLVER_TIMEOUT);
if (pid > 0) {
/* Main process */
#ifdef DEBUG