]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/proc.c
Check and call arc4random_stir() if present
[ngircd-alex.git] / src / ngircd / proc.c
index 2a5eda8304ea1c462612329118dbd698b00148c6..a5afb5011cb1c468732561d5944fa9f685c1c4e4 100644 (file)
@@ -50,7 +50,9 @@ GLOBAL pid_t
 Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout)
 {
        pid_t pid;
+#ifndef HAVE_ARC4RANDOM
        unsigned int seed;
+#endif
 
        assert(proc != NULL);
        assert(pipefds != NULL);
@@ -62,7 +64,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                return -1;
        }
 
+#ifndef HAVE_ARC4RANDOM
        seed = (unsigned int)rand();
+#endif
        pid = fork();
        switch (pid) {
        case -1:
@@ -73,13 +77,17 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                return -1;
        case 0:
                /* New child process: */
+#ifdef HAVE_ARC4RANDOM_STIR
+               arc4random_stir();
+#endif
+#ifndef HAVE_ARC4RANDOM
                srand(seed ^ (unsigned int)time(NULL) ^ getpid());
+#endif
                Signals_Exit();
                signal(SIGTERM, Proc_GenericSignalHandler);
                signal(SIGALRM, Proc_GenericSignalHandler);
                close(pipefds[0]);
                alarm(timeout);
-               Conn_CloseAllSockets();
                return 0;
        }
 
@@ -138,13 +146,14 @@ Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen)
                        return 0;
                Log(LOG_CRIT, "Can't read from child process %ld: %s",
                    proc->pid, strerror(errno));
+               Proc_Close(proc);
                bytes_read = 0;
+       } else if (bytes_read == 0) {
+               /* EOF: clean up */
+               LogDebug("Child process %ld: EOF reached, closing pipe.",
+                        proc->pid);
+               Proc_Close(proc);
        }
-#if DEBUG
-       else if (bytes_read == 0)
-               LogDebug("Can't read from child process %ld: EOF", proc->pid);
-#endif
-       Proc_InitStruct(proc);
        return (size_t)bytes_read;
 }
 
@@ -154,7 +163,10 @@ Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen)
 GLOBAL void
 Proc_Close(PROC_STAT *proc)
 {
-       io_close(proc->pipe_fd);
+       /* Close socket, if it exists */
+       if (proc->pipe_fd >= 0)
+               io_close(proc->pipe_fd);
+
        Proc_InitStruct(proc);
 }