scd,dirmngr: Keep the standard fds when daemonizing.
authorWerner Koch <wk@gnupg.org>
Wed, 16 Nov 2016 20:17:47 +0000 (21:17 +0100)
committerWerner Koch <wk@gnupg.org>
Wed, 16 Nov 2016 20:17:47 +0000 (21:17 +0100)
* dirmngr/dirmngr.c (main): Before calling setsid do not close the
standard fds but connect them to /dev/null.
* scd/scdaemon.c (main): Ditto.  Noet that the old test for a log
stream was even reverted.

--

Note that this was fixed for gpg-agent 10 years ago on 2006-11-09.

Signed-off-by: Werner Koch <wk@gnupg.org>
dirmngr/dirmngr.c
scd/scdaemon.c

index 254c543..db5079c 100644 (file)
@@ -1209,8 +1209,18 @@ main (int argc, char **argv)
           for (i=0; i <= 2; i++)
             {
               if (!log_test_fd (i) && i != fd )
-                close (i);
+                {
+                  if ( !close (i)
+                       && open ("/dev/null", i? O_WRONLY : O_RDONLY) == -1)
+                    {
+                      log_error ("failed to open '%s': %s\n",
+                                 "/dev/null", strerror (errno));
+                      cleanup ();
+                      dirmngr_exit (1);
+                    }
+                }
             }
+
           if (setsid() == -1)
             {
               log_error ("setsid() failed: %s\n", strerror(errno) );
index acc5b47..064cae9 100644 (file)
@@ -871,9 +871,19 @@ main (int argc, char **argv )
           /* Close stdin, stdout and stderr unless it is the log stream. */
           for (i=0; i <= 2; i++)
             {
-              if ( log_test_fd (i) && i != fd)
-                close (i);
+              if (!log_test_fd (i) && i != fd )
+                {
+                  if ( !close (i)
+                       && open ("/dev/null", i? O_WRONLY : O_RDONLY) == -1)
+                    {
+                      log_error ("failed to open '%s': %s\n",
+                                 "/dev/null", strerror (errno));
+                      cleanup ();
+                      exit (1);
+                    }
+                }
             }
+
           if (setsid() == -1)
             {
               log_error ("setsid() failed: %s\n", strerror(errno) );