From 75b601f18fdccad40fead041ad9e23e41775caf5 Mon Sep 17 00:00:00 2001 From: Greg Hudson Date: Wed, 18 Jan 2017 11:40:49 -0500 Subject: 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. (cherry picked from commit 50605efa5058583667227223a75ca44a512f4796) ticket: 8538 version_fixed: 1.15.1 --- src/lib/kdb/kdb5.c | 81 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 59 insertions(+), 22 deletions(-) diff --git a/src/lib/kdb/kdb5.c b/src/lib/kdb/kdb5.c index a3139a7..ee41272 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) -{ - 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_vtable(const kdb_vftabl *in, kdb_vftabl *out) +{ + /* 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; -- cgit v1.1