Add support for arc4random
authorFederico G. Schwindt <fgsch@lodoss.net>
Wed, 16 Oct 2013 10:15:27 +0000 (11:15 +0100)
committerFederico G. Schwindt <fgsch@lodoss.net>
Wed, 16 Oct 2013 15:32:06 +0000 (16:32 +0100)
If arc4random is present it will be used over the srand/rand interface.
This fixes some warnings in OpenBSD-current.

configure.ng
src/ngircd/conf.c
src/ngircd/irc-login.c
src/ngircd/ngircd.c
src/ngircd/proc.c
src/tool/tool.c

index faf3086..16f970f 100644 (file)
@@ -187,8 +187,9 @@ AC_CHECK_FUNCS([ \
 
 # Optional functions
 AC_CHECK_FUNCS_ONCE([ \
-       gai_strerror getaddrinfo getnameinfo inet_aton sigaction sigprocmask \
-       snprintf vsnprintf strdup strndup strlcpy strlcat strtok_r waitpid])
+       arc4random gai_strerror getaddrinfo getnameinfo inet_aton sigaction \
+       sigprocmask snprintf vsnprintf strdup strndup strlcpy strlcat strtok_r \
+       waitpid])
 
 # -- Configuration options --
 
index 9c2c912..d337947 100644 (file)
@@ -533,7 +533,11 @@ Conf_UnsetServer( CONN_ID Idx )
                                /* "Short" connection, enforce "ConnectRetry"
                                 * but randomize it a little bit: 15 seconds. */
                                Conf_Server[i].lasttry =
+#ifdef HAVE_ARC4RANDOM
+                                       t + (arc4random() % 15);
+#else
                                        t + rand() / (RAND_MAX / 15);
+#endif
                        }
                }
        }
index af087f9..d1b4033 100644 (file)
@@ -242,7 +242,11 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
 
 #ifndef STRICT_RFC
                        if (Conf_AuthPing) {
+#ifdef HAVE_ARC4RANDOM
+                               Conn_SetAuthPing(Client_Conn(Client), arc4random());
+#else
                                Conn_SetAuthPing(Client_Conn(Client), rand());
+#endif
                                IRC_WriteStrClient(Client, "PING :%ld",
                                        Conn_GetAuthPing(Client_Conn(Client)));
                                LogDebug("Connection %d: sent AUTH PING %ld ...",
index 6af5816..da53705 100644 (file)
@@ -613,6 +613,13 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
 #endif
 
 
+#ifdef HAVE_ARC4RANDOM
+static void
+Random_Init(void)
+{
+
+}
+#else
 static bool
 Random_Init_Kern(const char *file)
 {
@@ -642,6 +649,7 @@ Random_Init(void)
                return;
        srand(rand() ^ (unsigned)getpid() ^ (unsigned)time(NULL));
 }
+#endif
 
 
 /**
index e062cd0..d290f3b 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,7 +77,9 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
                return -1;
        case 0:
                /* New child process: */
+#ifndef HAVE_ARC4RANDOM
                srand(seed ^ (unsigned int)time(NULL) ^ getpid());
+#endif
                Signals_Exit();
                signal(SIGTERM, Proc_GenericSignalHandler);
                signal(SIGALRM, Proc_GenericSignalHandler);
index 1bb3ebe..3b9cc25 100644 (file)
@@ -144,11 +144,16 @@ ngt_RandomStr(char *String, const size_t len)
        assert(String != NULL);
 
        gettimeofday(&t, NULL);
+#ifndef HAVE_ARC4RANDOM
        srand((unsigned)(t.tv_usec * t.tv_sec));
 
        for (i = 0; i < len; ++i) {
                String[i] = chars[rand() % (sizeof(chars) - 1)];
        }
+#else
+       for (i = 0; i < len; ++i)
+               String[i] = chars[arc4random() % (sizeof(chars) - 1)];
+#endif
        String[len] = '\0';
 
        return String;