Blame SOURCES/Document-and-check-init_creds-context-requirement.patch

167778
From 7a9917db6b72d47cd19fb54dc34fc409353a3ea4 Mon Sep 17 00:00:00 2001
167778
From: Greg Hudson <ghudson@mit.edu>
167778
Date: Mon, 9 Jan 2017 11:44:29 -0500
167778
Subject: [PATCH] Document and check init_creds context requirement
167778
167778
To ensure that the same clpreauth plugin modules and moddata pointers
167778
are used for each step of an initial creds operation, the caller must
167778
use the same library context for krb5_init_creds_init(),
167778
krb5_init_creds_step(), and krb5_init_creds_free().  Document and
167778
enforce this requirement.
167778
167778
ticket: 7877
167778
(cherry picked from commit c4beb35c9ac0711ef650abc4f1e44a4c82d5f3d0)
167778
---
167778
 src/include/krb5/krb5.hin     | 13 +++++++++++++
167778
 src/lib/krb5/krb/get_in_tkt.c |  6 +++++-
167778
 src/lib/krb5/krb/int-proto.h  |  3 +++
167778
 src/lib/krb5/krb/preauth2.c   | 13 +++++++++++++
167778
 4 files changed, 34 insertions(+), 1 deletion(-)
167778
167778
diff --git a/src/include/krb5/krb5.hin b/src/include/krb5/krb5.hin
167778
index 53ad85384..28557659e 100644
167778
--- a/src/include/krb5/krb5.hin
167778
+++ b/src/include/krb5/krb5.hin
167778
@@ -7321,6 +7321,9 @@ typedef struct _krb5_init_creds_context *krb5_init_creds_context;
167778
  *
167778
  * @param [in] context          Library context
167778
  * @param [in] ctx              Initial credentials context
167778
+ *
167778
+ * @a context must be the same as the one passed to krb5_init_creds_init() for
167778
+ * this initial credentials context.
167778
  */
167778
 void KRB5_CALLCONV
167778
 krb5_init_creds_free(krb5_context context, krb5_init_creds_context ctx);
167778
@@ -7335,6 +7338,9 @@ krb5_init_creds_free(krb5_context context, krb5_init_creds_context ctx);
167778
  * krb5_init_creds_init().  On successful return, the credentials can be
167778
  * retrieved with krb5_init_creds_get_creds().
167778
  *
167778
+ * @a context must be the same as the one passed to krb5_init_creds_init() for
167778
+ * this initial credentials context.
167778
+ *
167778
  * @retval 0 Success; otherwise - Kerberos error codes
167778
  */
167778
 krb5_error_code KRB5_CALLCONV
167778
@@ -7385,6 +7391,10 @@ krb5_init_creds_get_error(krb5_context context, krb5_init_creds_context ctx,
167778
  * This function creates a new context for acquiring initial credentials.  Use
167778
  * krb5_init_creds_free() to free @a ctx when it is no longer needed.
167778
  *
167778
+ * Any subsequent calls to krb5_init_creds_step(), krb5_init_creds_get(), or
167778
+ * krb5_init_creds_free() for this initial credentials context must use the
167778
+ * same @a context argument as the one passed to this function.
167778
+ *
167778
  * @retval 0 Success; otherwise - Kerberos error codes
167778
  */
167778
 krb5_error_code KRB5_CALLCONV
167778
@@ -7434,6 +7444,9 @@ krb5_init_creds_set_keytab(krb5_context context, krb5_init_creds_context ctx,
167778
  * transmit the next request using TCP rather than UDP.  If this function
167778
  * returns any other error, the initial credential exchange has failed.
167778
  *
167778
+ * @a context must be the same as the one passed to krb5_init_creds_init() for
167778
+ * this initial credentials context.
167778
+ *
167778
  * @retval 0 Success; otherwise - Kerberos error codes
167778
  */
167778
 krb5_error_code KRB5_CALLCONV
167778
diff --git a/src/lib/krb5/krb/get_in_tkt.c b/src/lib/krb5/krb/get_in_tkt.c
167778
index 80f5e1870..52e07bb67 100644
167778
--- a/src/lib/krb5/krb/get_in_tkt.c
167778
+++ b/src/lib/krb5/krb/get_in_tkt.c
167778
@@ -1667,7 +1667,7 @@ krb5_init_creds_step(krb5_context context,
167778
                      krb5_data *realm,
167778
                      unsigned int *flags)
167778
 {
167778
-    krb5_error_code code = 0, code2;
167778
+    krb5_error_code code, code2;
167778
 
167778
     *flags = 0;
167778
 
167778
@@ -1680,6 +1680,10 @@ krb5_init_creds_step(krb5_context context,
167778
     if (ctx->complete)
167778
         return EINVAL;
167778
 
167778
+    code = k5_preauth_check_context(context, ctx);
167778
+    if (code)
167778
+        return code;
167778
+
167778
     if (in->length != 0) {
167778
         code = init_creds_step_reply(context, ctx, in);
167778
         if (code == KRB5KRB_ERR_RESPONSE_TOO_BIG) {
167778
diff --git a/src/lib/krb5/krb/int-proto.h b/src/lib/krb5/krb/int-proto.h
167778
index f1667c238..628f0baa8 100644
167778
--- a/src/lib/krb5/krb/int-proto.h
167778
+++ b/src/lib/krb5/krb/int-proto.h
167778
@@ -208,6 +208,9 @@ void
167778
 k5_preauth_request_context_fini(krb5_context context,
167778
                                 krb5_init_creds_context ctx);
167778
 
167778
+krb5_error_code
167778
+k5_preauth_check_context(krb5_context context, krb5_init_creds_context ctx);
167778
+
167778
 krb5_error_code
167778
 k5_response_items_new(k5_response_items **ri_out);
167778
 
167778
diff --git a/src/lib/krb5/krb/preauth2.c b/src/lib/krb5/krb/preauth2.c
167778
index 9a178f4e3..9c5d6eaa9 100644
167778
--- a/src/lib/krb5/krb/preauth2.c
167778
+++ b/src/lib/krb5/krb/preauth2.c
167778
@@ -296,6 +296,19 @@ k5_preauth_request_context_fini(krb5_context context,
167778
     ctx->preauth_reqctx = NULL;
167778
 }
167778
 
167778
+krb5_error_code
167778
+k5_preauth_check_context(krb5_context context, krb5_init_creds_context ctx)
167778
+{
167778
+    krb5_preauth_req_context reqctx = ctx->preauth_reqctx;
167778
+
167778
+    if (reqctx != NULL && reqctx->orig_context != context) {
167778
+        k5_setmsg(context, EINVAL,
167778
+                  _("krb5_init_creds calls must use same library context"));
167778
+        return EINVAL;
167778
+    }
167778
+    return 0;
167778
+}
167778
+
167778
 /* Return 1 if pa_type is a real preauthentication mechanism according to the
167778
  * module h.  Return 0 if it is not. */
167778
 static int