krb5 commit: Fix PKINIT memory leaks

Greg Hudson ghudson at mit.edu
Tue Mar 23 00:26:21 EDT 2021


https://github.com/krb5/krb5/commit/aee8a823db095eda5842420e917fe7a664a0e7af
commit aee8a823db095eda5842420e917fe7a664a0e7af
Author: Greg Hudson <ghudson at mit.edu>
Date:   Wed Mar 10 21:53:33 2021 -0500

    Fix PKINIT memory leaks
    
    pkinit_client_process() calls pkinit_client_profile() a second time,
    leaking the values obtained the first time.  Remove the call.
    
    Commit 13ae08e70a05768d4f65978ce1a8d4e16fec0d35 introduced more
    possibilities for process_option_identity() to return failure after it
    filled in some fields.  PKCS11 option parsing already prevents leaks
    by freeing old values before setting new ones; do so in the other
    option-parsing functions as well.
    
    ticket: 8991 (new)

 src/plugins/preauth/pkinit/pkinit_clnt.c     |    2 --
 src/plugins/preauth/pkinit/pkinit_identity.c |    5 +++++
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/plugins/preauth/pkinit/pkinit_clnt.c b/src/plugins/preauth/pkinit/pkinit_clnt.c
index b6266b4..e2f8154 100644
--- a/src/plugins/preauth/pkinit/pkinit_clnt.c
+++ b/src/plugins/preauth/pkinit/pkinit_clnt.c
@@ -1105,8 +1105,6 @@ pkinit_client_process(krb5_context context, krb5_clpreauth_moddata moddata,
                                    _("No pkinit_anchors supplied"));
             return KRB5_PREAUTH_FAILED;
         }
-        pkinit_client_profile(context, plgctx, reqctx, cb, rock,
-                              &request->server->realm);
         /* Pull in PINs and passwords for identities which we deferred
          * loading earlier. */
         retval = pkinit_client_parse_answers(context, moddata, modreq,
diff --git a/src/plugins/preauth/pkinit/pkinit_identity.c b/src/plugins/preauth/pkinit/pkinit_identity.c
index 4c8e843..62b2cf7 100644
--- a/src/plugins/preauth/pkinit/pkinit_identity.c
+++ b/src/plugins/preauth/pkinit/pkinit_identity.c
@@ -333,6 +333,8 @@ parse_fs_options(krb5_context context,
     if (key_filename == NULL)
         goto cleanup;
 
+    free(idopts->cert_filename);
+    free(idopts->key_filename);
     idopts->cert_filename = cert_filename;
     idopts->key_filename = key_filename;
     cert_filename = key_filename = NULL;
@@ -355,10 +357,12 @@ parse_pkcs12_options(krb5_context context,
     if (residual == NULL || residual[0] == '\0')
         return 0;
 
+    free(idopts->cert_filename);
     idopts->cert_filename = strdup(residual);
     if (idopts->cert_filename == NULL)
         goto cleanup;
 
+    free(idopts->key_filename);
     idopts->key_filename = strdup(residual);
     if (idopts->key_filename == NULL)
         goto cleanup;
@@ -438,6 +442,7 @@ process_option_identity(krb5_context context,
         break;
 #endif
     case IDTYPE_DIR:
+        free(idopts->cert_filename);
         idopts->cert_filename = strdup(residual);
         if (idopts->cert_filename == NULL)
             retval = ENOMEM;


More information about the cvs-krb5 mailing list