krb5 commit: Modernize krb5_read_password()

Greg Hudson ghudson at mit.edu
Thu Aug 9 12:41:23 EDT 2018


https://github.com/krb5/krb5/commit/e3d3c951b243a230c535233ebf9c8950d255b70b
commit e3d3c951b243a230c535233ebf9c8950d255b70b
Author: Greg Hudson <ghudson at mit.edu>
Date:   Sun Aug 5 18:48:57 2018 -0400

    Modernize krb5_read_password()
    
    In krb5_read_password(), don't reuse k5prompt for verification as we
    will reference it later.  Also use make_data() and zap(), and clean up
    formatting.

 src/lib/krb5/os/read_pwd.c |   47 +++++++++++++++++++++----------------------
 1 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/src/lib/krb5/os/read_pwd.c b/src/lib/krb5/os/read_pwd.c
index f26896d..4a5337f 100644
--- a/src/lib/krb5/os/read_pwd.c
+++ b/src/lib/krb5/os/read_pwd.c
@@ -42,38 +42,37 @@ krb5_read_password(krb5_context context,
                    const char *prompt, const char *prompt2,
                    char *return_pwd, unsigned int *size_return)
 {
-    krb5_data reply_data;
-    krb5_prompt k5prompt;
+    krb5_data reply_data, verify_data = empty_data();
+    krb5_prompt k5prompt, vprompt;
     krb5_error_code retval;
-    reply_data.length = *size_return; /* NB: size_return is also an input */
-    reply_data.data = return_pwd;
+
+    /* *size_return is the space available in the return buffer on input. */
+    reply_data = make_data(return_pwd, *size_return);
     k5prompt.prompt = (char *)prompt;
     k5prompt.hidden = 1;
     k5prompt.reply = &reply_data;
-    retval =  krb5_prompter_posix(NULL,
-                                  NULL, NULL, NULL, 1, &k5prompt);
-
-    if ((retval==0) && prompt2) {
-        krb5_data verify_data;
-        verify_data.data = malloc(*size_return);
-        verify_data.length = *size_return;
-        k5prompt.prompt = (char *)prompt2;
-        k5prompt.reply = &verify_data;
-        if (!verify_data.data)
-            return ENOMEM;
-        retval = krb5_prompter_posix(NULL,
-                                     NULL,NULL, NULL, 1, &k5prompt);
-        if (retval == 0) {
-            /* compare */
-            if (strncmp(return_pwd, (char *)verify_data.data, *size_return))
-                retval = KRB5_LIBOS_BADPWDMATCH;
-        }
-        free(verify_data.data);
-    }
+    retval = krb5_prompter_posix(NULL, NULL, NULL, NULL, 1, &k5prompt);
+    if (retval || prompt2 == NULL)
+        goto done;
+
+    retval = alloc_data(&verify_data, *size_return);
+    if (retval)
+        goto done;
+    vprompt.prompt = (char *)prompt2;
+    vprompt.hidden = 1;
+    vprompt.reply = &verify_data;
+    retval = krb5_prompter_posix(NULL, NULL, NULL, NULL, 1, &vprompt);
+    if (retval)
+        goto done;
+    if (strncmp(return_pwd, verify_data.data, *size_return) != 0)
+        retval = KRB5_LIBOS_BADPWDMATCH;
+
+done:
+    zapfree(verify_data.data, verify_data.length);
     if (!retval)
         *size_return = k5prompt.reply->length;
     else
-        memset(return_pwd, 0, *size_return);
+        zap(return_pwd, *size_return);
     return retval;
 }
 #endif


More information about the cvs-krb5 mailing list