diff --git a/lib/gssapi/gssapi_mech.h b/lib/gssapi/gssapi_mech.h index 4d5613c73..c9345700e 100644 --- a/lib/gssapi/gssapi_mech.h +++ b/lib/gssapi/gssapi_mech.h @@ -454,9 +454,16 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_release_any_name_mapping_t ( gss_any_t * /* input */ ); +/* + * + */ typedef struct gss_mo_desc_struct gss_mo_desc; +typedef OM_uint32 GSSAPI_CALLCONV +_gss_mo_init (OM_uint32 *, gss_OID, gss_mo_desc **, size_t *); + + struct gss_mo_desc_struct { gss_OID option; OM_uint32 flags; @@ -469,7 +476,7 @@ struct gss_mo_desc_struct { }; -#define GMI_VERSION 4 +#define GMI_VERSION 5 /* gm_flags */ #define GM_USE_MG_CRED 1 /* uses mech glue credentials */ diff --git a/lib/gssapi/mech/gss_mech_switch.c b/lib/gssapi/mech/gss_mech_switch.c index 2698bea2b..ccd497b7b 100644 --- a/lib/gssapi/mech/gss_mech_switch.c +++ b/lib/gssapi/mech/gss_mech_switch.c @@ -242,6 +242,8 @@ _gss_load_mech(void) rk_cloexec_file(fp); while (fgets(buf, sizeof(buf), fp)) { + _gss_mo_init *mi; + if (*buf == '#') continue; p = buf; @@ -350,6 +352,16 @@ _gss_load_mech(void) OPTSYM(map_name_to_any); OPTSYM(release_any_name_mapping); + mi = dlsym(so, "gss_mo_init"); + if (mi != NULL) { + major_status = mi(&minor_status, + &mech_oid, + &m->gm_mech.gm_mo, + &m->gm_mech.gm_mo_num); + if (GSS_ERROR(major_status)) + goto bad; + } + HEIM_SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link); continue;