summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2013-04-01 13:25:33 -0400
committerGreg Hudson <ghudson@mit.edu>2013-04-01 13:25:33 -0400
commitf9c5d2277c23e40b2e929cef6e4654113b66da68 (patch)
tree00d2e3882db74ca5cb11b4e9a31b5a8408eac9a2
parentf43dfa88148724fb8a9543015c69fa1b2b24bb66 (diff)
downloadkrb5-f9c5d2277c23e40b2e929cef6e4654113b66da68.tar.gz
krb5-f9c5d2277c23e40b2e929cef6e4654113b66da68.tar.xz
krb5-f9c5d2277c23e40b2e929cef6e4654113b66da68.zip
Add krb5_kt_dup API and use it in two places
Add an API to duplicate keytab handles, mirroring krb5_cc_dup. Use it to simplify the krb5 GSS acquire_cred code. ticket: 7599 (new)
-rw-r--r--doc/appdev/refs/api/index.rst1
-rw-r--r--src/include/krb5/krb5.hin15
-rw-r--r--src/lib/gssapi/krb5/acquire_cred.c31
-rw-r--r--src/lib/krb5/keytab/ktbase.c10
-rw-r--r--src/lib/krb5/libkrb5.exports1
-rw-r--r--src/lib/krb5_32.def1
6 files changed, 34 insertions, 25 deletions
diff --git a/doc/appdev/refs/api/index.rst b/doc/appdev/refs/api/index.rst
index b87859f45c..7009b30dca 100644
--- a/doc/appdev/refs/api/index.rst
+++ b/doc/appdev/refs/api/index.rst
@@ -69,6 +69,7 @@ Frequently used public interfaces
krb5_kt_client_default.rst
krb5_kt_default.rst
krb5_kt_default_name.rst
+ krb5_kt_dup.rst
krb5_kt_get_name.rst
krb5_kt_get_type.rst
krb5_kt_resolve.rst
diff --git a/src/include/krb5/krb5.hin b/src/include/krb5/krb5.hin
index e0c6f12396..97810b5c8f 100644
--- a/src/include/krb5/krb5.hin
+++ b/src/include/krb5/krb5.hin
@@ -4188,6 +4188,21 @@ krb5_error_code KRB5_CALLCONV
krb5_kt_resolve(krb5_context context, const char *name, krb5_keytab *ktid);
/**
+ * Duplicate keytab handle.
+ *
+ * @param [in] context Library context
+ * @param [in] in Key table handle to be duplicated
+ * @param [out] out Key table handle
+ *
+ * Create a new handle referring to the same key table as @a in. The new
+ * handle and @a in can be closed independently.
+ *
+ * @version New in 1.12
+ */
+krb5_error_code KRB5_CALLCONV
+krb5_kt_dup(krb5_context context, krb5_keytab in, krb5_keytab *out);
+
+/**
* Get the default key table name.
*
* @param [in] context Library context
diff --git a/src/lib/gssapi/krb5/acquire_cred.c b/src/lib/gssapi/krb5/acquire_cred.c
index c4c596b871..dbc5a701aa 100644
--- a/src/lib/gssapi/krb5/acquire_cred.c
+++ b/src/lib/gssapi/krb5/acquire_cred.c
@@ -194,15 +194,7 @@ acquire_accept_cred(krb5_context context,
assert(cred->keytab == NULL);
if (req_keytab != NULL) {
- char ktname[BUFSIZ];
-
- /* Duplicate keytab handle */
- code = krb5_kt_get_name(context, req_keytab, ktname, sizeof(ktname));
- if (code) {
- *minor_status = code;
- return GSS_S_CRED_UNAVAIL;
- }
- code = krb5_kt_resolve(context, ktname, &kt);
+ code = krb5_kt_dup(context, req_keytab, &kt);
} else {
code = k5_mutex_lock(&gssint_krb5_keytab_lock);
if (code) {
@@ -660,23 +652,12 @@ acquire_init_cred(krb5_context context,
goto error;
}
- if (client_keytab != NULL) {
- char ktname[BUFSIZ];
-
- /* Duplicate keytab handle */
- code = krb5_kt_get_name(context, client_keytab, ktname,
- sizeof(ktname));
- if (code)
- goto error;
-
- code = krb5_kt_resolve(context, ktname, &cred->client_keytab);
- if (code)
- goto error;
- } else {
+ if (client_keytab != NULL)
+ code = krb5_kt_dup(context, client_keytab, &cred->client_keytab);
+ else
code = krb5_kt_client_default(context, &cred->client_keytab);
- if (code)
- goto error;
- }
+ if (code)
+ goto error;
if (password != GSS_C_NO_BUFFER) {
pwdata = make_data(password->value, password->length);
diff --git a/src/lib/krb5/keytab/ktbase.c b/src/lib/krb5/keytab/ktbase.c
index 0f3562f339..848b047f45 100644
--- a/src/lib/krb5/keytab/ktbase.c
+++ b/src/lib/krb5/keytab/ktbase.c
@@ -218,6 +218,16 @@ cleanup:
return err;
}
+krb5_error_code KRB5_CALLCONV
+krb5_kt_dup(krb5_context context, krb5_keytab in, krb5_keytab *out)
+{
+ krb5_error_code err;
+ char name[BUFSIZ];
+
+ err = in->ops->get_name(context, in, name, sizeof(name));
+ return err ? err : krb5_kt_resolve(context, name, out);
+}
+
/*
* Routines to deal with externalizingt krb5_keytab.
* keytab_size();
diff --git a/src/lib/krb5/libkrb5.exports b/src/lib/krb5/libkrb5.exports
index b0547d52af..03273df1ab 100644
--- a/src/lib/krb5/libkrb5.exports
+++ b/src/lib/krb5/libkrb5.exports
@@ -411,6 +411,7 @@ krb5_kt_close
krb5_kt_default
krb5_kt_default_name
krb5_kt_dfl_ops
+krb5_kt_dup
krb5_kt_end_seq_get
krb5_kt_free_entry
krb5_kt_get_entry
diff --git a/src/lib/krb5_32.def b/src/lib/krb5_32.def
index 57604ade49..9bff8a7ebc 100644
--- a/src/lib/krb5_32.def
+++ b/src/lib/krb5_32.def
@@ -446,3 +446,4 @@ EXPORTS
; new in 1.12
krb5_free_enctypes @419
+ krb5_kt_dup @420