random: Silent warning under NetBSD using rndunix
authorWerner Koch <wk@gnupg.org>
Mon, 5 Jan 2015 18:38:29 +0000 (19:38 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 5 Jan 2015 18:38:29 +0000 (19:38 +0100)
* random/rndunix.c (STDERR_FILENO): Define if needed.
(start_gatherer): Re-open standard descriptors.  Fix an
unsigned/signed pointer warning.
--

GnuPG-bug-id: 1702

configure.ac
random/rndunix.c

index 161571a..4cfebe7 100644 (file)
@@ -2184,11 +2184,10 @@ cat <<G10EOF
                  Entropy Gathering Daemon (EGD)
 
    which provides a entropy source for the whole system.  It is written
-   in Perl and available at the GnuPG FTP servers.  To enable EGD you
-   should rerun configure with the option "--enable-static-rnd=egd".
-   For more information consult the GnuPG webpages:
+   in Perl and available at the GnuPG FTP servers.  For more information
+   consult the GnuPG site:
 
-             http://www.gnupg.org/download.html#egd
+          https://gnupg.org/related_software/swlist.html#egd
 
 G10EOF
 fi
index 1b810d7..315906b 100644 (file)
 #ifndef STDOUT_FILENO
 #define STDOUT_FILENO 1
 #endif
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
 
 #define GATHER_BUFSIZE         49152   /* Usually about 25K are filled */
 
@@ -766,13 +769,27 @@ start_gatherer( int pipefd )
 
     fclose(stderr);            /* Arrghh!!  It's Stuart code!! */
 
+    /* Mary goes to Berkeley: NetBSD emits warnings if the standard
+       descriptors are not open when running setuid program.  Thus we
+       connect them to the bitbucket if they are not already open.  */
+    {
+      struct stat statbuf;
+
+      if (fstat (STDIN_FILENO, &statbuf) == -1 && errno == EBADF)
+        open ("/dev/null",O_RDONLY);
+      if (fstat (STDOUT_FILENO, &statbuf) == -1 && errno == EBADF)
+        open ("/dev/null",O_WRONLY);
+      if (fstat (STDERR_FILENO, &statbuf) == -1 && errno == EBADF)
+        open ("/dev/null",O_WRONLY);
+    }
+
     for(;;) {
        GATHER_MSG msg;
        size_t nbytes;
        const char *p;
 
        msg.usefulness = slow_poll( dbgfp, dbgall, &nbytes );
-       p = gather_buffer;
+       p = (const char*)gather_buffer;
        while( nbytes ) {
            msg.ndata = nbytes > sizeof(msg.data)? sizeof(msg.data) : nbytes;
            memcpy( msg.data, p, msg.ndata );