diff src/tls.c @ 5892:053ef01b71a8

Import the #'clear-string API from GNU, use it in tls.c src/ChangeLog addition: 2015-04-18 Aidan Kehoe <kehoea@parhasard.net> * sequence.c (Fclear_string): New, API from GNU. Zero a string's contents, making sure the text is not kept around even when the string's data is reallocated because of a changed character length. * sequence.c (syms_of_sequence): Make it available to Lisp. * lisp.h: Make it available to C code. * tls.c (nss_pk11_password): Use it. * tls.c (gnutls_pk11_password): Use it. * tls.c (openssl_password): Use it. tests/ChangeLog addition: 2015-04-18 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: Test #'clear-string, just added. Unfortunately there's no way to be certain from Lisp that the old password data has been erased after realloc; it may be worth adding a test to tests.c, but *we'll be reading memory we shouldn't be*, so that gives me pause.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 18 Apr 2015 23:00:14 +0100
parents a85efdabe237
children
line wrap: on
line diff
--- a/src/tls.c	Sat Apr 11 18:34:14 2015 +0100
+++ b/src/tls.c	Sat Apr 18 23:00:14 2015 +0100
@@ -302,7 +302,7 @@
 static char *
 nss_pk11_password (PK11SlotInfo *slot, PRBool retry, void * UNUSED (arg))
 {
-  Lisp_Object lsp_password, args[2];
+  Lisp_Object lsp_password;
   Extbyte *c_password, *nss_password;
   const Extbyte *token_name;
 
@@ -319,10 +319,9 @@
   nss_password = PL_strdup (c_password);
 
   /* Wipe out the password on the stack and in the Lisp string */
-  args[0] = lsp_password;
-  args[1] = make_char ('*');
-  Ffill (2, args);
+  Fclear_string (lsp_password);
   memset (c_password, '*', strlen (c_password));
+
   return nss_password;
 }
 
@@ -729,10 +728,9 @@
   pin[len] = '\0';
 
   /* Wipe out the password on the stack and in the Lisp string */
-  args[0] = lsp_password;
-  args[1] = make_char ('*');
-  Ffill (2, args);
+  Fclear_string (lsp_password);
   memset (c_password, '*', strlen (c_password));
+
   return GNUTLS_E_SUCCESS;
 }
 
@@ -1075,7 +1073,7 @@
 openssl_password (char *buf, int size, int UNUSED (rwflag),
 		  void *UNUSED (userdata))
 {
-  Lisp_Object lsp_password, args[2];
+  Lisp_Object lsp_password;
   Extbyte *c_password;
 
   lsp_password =
@@ -1084,10 +1082,9 @@
   strncpy (buf, c_password, size);
 
   /* Wipe out the password on the stack and in the Lisp string */
-  args[0] = lsp_password;
-  args[1] = make_char ('*');
-  Ffill (2, args);
+  Fclear_string (lsp_password);
   memset (c_password, '*', strlen (c_password));
+
   return (int) strlen (buf);
 }