621f3cf2e6
Add KDB version flag. All patches are touched because git made the hash lengths in patches longer.
122 lines
5.0 KiB
Diff
122 lines
5.0 KiB
Diff
From f6dce77d8f1606c3443f47517ef101a6f1978d69 Mon Sep 17 00:00:00 2001
|
|
From: Greg Hudson <ghudson@mit.edu>
|
|
Date: Wed, 18 Jan 2017 11:40:49 -0500
|
|
Subject: [PATCH] Explicitly copy KDB vtable fields
|
|
|
|
In preparation for bumping the kdb_vftabl minor version, use explicit
|
|
field assignments when copying the module vtable to the internal copy,
|
|
so that we can conditionalize assignments for minor versions greater
|
|
than 0.
|
|
|
|
ticket: 8538
|
|
(cherry picked from commit 50605efa5058583667227223a75ca44a512f4796)
|
|
---
|
|
src/lib/kdb/kdb5.c | 79 +++++++++++++++++++++++++++++++++++++++---------------
|
|
1 file changed, 58 insertions(+), 21 deletions(-)
|
|
|
|
diff --git a/src/lib/kdb/kdb5.c b/src/lib/kdb/kdb5.c
|
|
index a3139a7dc..ee4127231 100644
|
|
--- a/src/lib/kdb/kdb5.c
|
|
+++ b/src/lib/kdb/kdb5.c
|
|
@@ -283,24 +283,63 @@ clean_n_exit:
|
|
}
|
|
|
|
static void
|
|
-kdb_setup_opt_functions(db_library lib)
|
|
+copy_vtable(const kdb_vftabl *in, kdb_vftabl *out)
|
|
{
|
|
- if (lib->vftabl.fetch_master_key == NULL)
|
|
- lib->vftabl.fetch_master_key = krb5_db_def_fetch_mkey;
|
|
- if (lib->vftabl.fetch_master_key_list == NULL)
|
|
- lib->vftabl.fetch_master_key_list = krb5_def_fetch_mkey_list;
|
|
- if (lib->vftabl.store_master_key_list == NULL)
|
|
- lib->vftabl.store_master_key_list = krb5_def_store_mkey_list;
|
|
- if (lib->vftabl.dbe_search_enctype == NULL)
|
|
- lib->vftabl.dbe_search_enctype = krb5_dbe_def_search_enctype;
|
|
- if (lib->vftabl.change_pwd == NULL)
|
|
- lib->vftabl.change_pwd = krb5_dbe_def_cpw;
|
|
- if (lib->vftabl.decrypt_key_data == NULL)
|
|
- lib->vftabl.decrypt_key_data = krb5_dbe_def_decrypt_key_data;
|
|
- if (lib->vftabl.encrypt_key_data == NULL)
|
|
- lib->vftabl.encrypt_key_data = krb5_dbe_def_encrypt_key_data;
|
|
- if (lib->vftabl.rename_principal == NULL)
|
|
- lib->vftabl.rename_principal = krb5_db_def_rename_principal;
|
|
+ /* Copy fields for minor version 0. */
|
|
+ out->maj_ver = in->maj_ver;
|
|
+ out->min_ver = in->min_ver;
|
|
+ out->init_library = in->init_library;
|
|
+ out->fini_library = in->fini_library;
|
|
+ out->init_module = in->init_module;
|
|
+ out->fini_module = in->fini_module;
|
|
+ out->create = in->create;
|
|
+ out->destroy = in->destroy;
|
|
+ out->get_age = in->get_age;
|
|
+ out->lock = in->lock;
|
|
+ out->unlock = in->unlock;
|
|
+ out->get_principal = in->get_principal;
|
|
+ out->put_principal = in->put_principal;
|
|
+ out->delete_principal = in->delete_principal;
|
|
+ out->rename_principal = in->rename_principal;
|
|
+ out->iterate = in->iterate;
|
|
+ out->create_policy = in->create_policy;
|
|
+ out->get_policy = in->get_policy;
|
|
+ out->put_policy = in->put_policy;
|
|
+ out->iter_policy = in->iter_policy;
|
|
+ out->delete_policy = in->delete_policy;
|
|
+ out->fetch_master_key = in->fetch_master_key;
|
|
+ out->fetch_master_key_list = in->fetch_master_key_list;
|
|
+ out->store_master_key_list = in->store_master_key_list;
|
|
+ out->dbe_search_enctype = in->dbe_search_enctype;
|
|
+ out->change_pwd = in->change_pwd;
|
|
+ out->promote_db = in->promote_db;
|
|
+ out->decrypt_key_data = in->decrypt_key_data;
|
|
+ out->encrypt_key_data = in->encrypt_key_data;
|
|
+ out->sign_authdata = in->sign_authdata;
|
|
+ out->check_transited_realms = in->check_transited_realms;
|
|
+ out->check_policy_as = in->check_policy_as;
|
|
+ out->check_policy_tgs = in->check_policy_tgs;
|
|
+ out->audit_as_req = in->audit_as_req;
|
|
+ out->refresh_config = in->refresh_config;
|
|
+ out->check_allowed_to_delegate = in->check_allowed_to_delegate;
|
|
+
|
|
+ /* Set defaults for optional fields. */
|
|
+ if (out->fetch_master_key == NULL)
|
|
+ out->fetch_master_key = krb5_db_def_fetch_mkey;
|
|
+ if (out->fetch_master_key_list == NULL)
|
|
+ out->fetch_master_key_list = krb5_def_fetch_mkey_list;
|
|
+ if (out->store_master_key_list == NULL)
|
|
+ out->store_master_key_list = krb5_def_store_mkey_list;
|
|
+ if (out->dbe_search_enctype == NULL)
|
|
+ out->dbe_search_enctype = krb5_dbe_def_search_enctype;
|
|
+ if (out->change_pwd == NULL)
|
|
+ out->change_pwd = krb5_dbe_def_cpw;
|
|
+ if (out->decrypt_key_data == NULL)
|
|
+ out->decrypt_key_data = krb5_dbe_def_decrypt_key_data;
|
|
+ if (out->encrypt_key_data == NULL)
|
|
+ out->encrypt_key_data = krb5_dbe_def_encrypt_key_data;
|
|
+ if (out->rename_principal == NULL)
|
|
+ out->rename_principal = krb5_db_def_rename_principal;
|
|
}
|
|
|
|
#ifdef STATIC_PLUGINS
|
|
@@ -334,8 +373,7 @@ kdb_load_library(krb5_context kcontext, char *lib_name, db_library *libptr)
|
|
return ENOMEM;
|
|
|
|
strlcpy(lib->name, lib_name, sizeof(lib->name));
|
|
- memcpy(&lib->vftabl, vftabl_addr, sizeof(kdb_vftabl));
|
|
- kdb_setup_opt_functions(lib);
|
|
+ copy_vtable(vftabl_addr, &lib->vftabl);
|
|
|
|
status = lib->vftabl.init_library();
|
|
if (status)
|
|
@@ -433,8 +471,7 @@ kdb_load_library(krb5_context kcontext, char *lib_name, db_library *lib)
|
|
goto clean_n_exit;
|
|
}
|
|
|
|
- memcpy(&(*lib)->vftabl, vftabl_addrs[0], sizeof(kdb_vftabl));
|
|
- kdb_setup_opt_functions(*lib);
|
|
+ copy_vtable(vftabl_addrs[0], &(*lib)->vftabl);
|
|
|
|
if ((status = (*lib)->vftabl.init_library()))
|
|
goto clean_n_exit;
|