From: Greg Hudson Date: Sun, 5 Aug 2018 22:48:57 +0000 (-0400) Subject: Modernize krb5_read_password() X-Git-Tag: krb5-1.17-beta1~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3d3c951b243a230c535233ebf9c8950d255b70b;p=thirdparty%2Fkrb5.git 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. --- diff --git a/src/lib/krb5/os/read_pwd.c b/src/lib/krb5/os/read_pwd.c index f26896d5fa..4a5337f3f2 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