* call-scd.c (atfork_cb): New.
authorWerner Koch <wk@gnupg.org>
Sat, 24 Jan 2004 20:50:49 +0000 (20:50 +0000)
committerWerner Koch <wk@gnupg.org>
Sat, 24 Jan 2004 20:50:49 +0000 (20:50 +0000)
(start_scd): Make sure secmem gets cleared.
* query.c  (atfork_cb): New.
(start_pinentry): Make sure secmem gets cleared.

agent/ChangeLog
agent/call-scd.c
agent/query.c

index 263259f..bd009ec 100644 (file)
@@ -1,3 +1,10 @@
+2004-01-24  Werner Koch  <wk@gnupg.org>
+
+       * call-scd.c (atfork_cb): New.
+       (start_scd): Make sure secmem gets cleared.
+       * query.c  (atfork_cb): New.
+       (start_pinentry): Make sure secmem gets cleared.
+
 2004-01-16  Werner Koch  <wk@gnupg.org>
 
        * findkey.c (agent_key_from_file): Now return an error code so
index 14487f1..f205fb0 100644 (file)
@@ -152,6 +152,16 @@ unlock_scd (int rc)
   return rc;
 }
 
+/* To make sure we leave no secrets in our image after forking of the
+   scdaemon, we use this callback. */
+static void
+atfork_cb (void *opaque, int where)
+{
+  if (!where)
+    gcry_control (GCRYCTL_TERM_SECMEM);
+}
+
+
 /* Fork off the SCdaemon if this has not already been done */
 static int
 start_scd (void)
@@ -206,9 +216,9 @@ start_scd (void)
     }
   no_close_list[i] = -1;
 
-  /* connect to the pinentry and perform initial handshaking */
-  rc = assuan_pipe_connect (&ctx, opt.scdaemon_program, (char**)argv,
-                            no_close_list);
+  /* Connect to the pinentry and perform initial handshaking */
+  rc = assuan_pipe_connect2 (&ctx, opt.scdaemon_program, (char**)argv,
+                             no_close_list, atfork_cb, NULL);
   if (rc)
     {
       log_error ("can't connect to the SCdaemon: %s\n",
index 4a05196..a3a7733 100644 (file)
@@ -78,6 +78,17 @@ unlock_pinentry (int rc)
   return rc;
 }
 
+
+/* To make sure we leave no secrets in our image after forking of the
+   pinentry, we use this callback. */
+static void
+atfork_cb (void *opaque, int where)
+{
+  if (!where)
+    gcry_control (GCRYCTL_TERM_SECMEM);
+}
+
+
 /* Fork off the pin entry if this has not already been done.  Note,
    that this function must always be used to aquire the lock for the
    pinentry - we will serialize _all_ pinentry calls.
@@ -139,9 +150,9 @@ start_pinentry (CTRL ctrl)
     }
   no_close_list[i] = -1;
 
-  /* connect to the pinentry and perform initial handshaking */
-  rc = assuan_pipe_connect (&ctx, opt.pinentry_program, (char**)argv,
-                            no_close_list);
+  /* Connect to the pinentry and perform initial handshaking */
+  rc = assuan_pipe_connect2 (&ctx, opt.pinentry_program, (char**)argv,
+                             no_close_list, atfork_cb, NULL);
   if (rc)
     {
       log_error ("can't connect to the PIN entry module: %s\n",