mechglue fixes
- support gssspi_set_cred_option - pick up OID sets of names for dynamic mechs
This commit is contained in:
@@ -160,7 +160,17 @@ do { \
|
|||||||
|
|
||||||
#define OPTSYM(name) \
|
#define OPTSYM(name) \
|
||||||
do { \
|
do { \
|
||||||
m->gm_mech.gm_ ## name = dlsym(so, "gss_" #name); \
|
m->gm_mech.gm_ ## name = dlsym(so, "gss_" #name); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define OPTSPISYM(name) \
|
||||||
|
do { \
|
||||||
|
m->gm_mech.gm_ ## name = dlsym(so, "gssspi_" #name); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define COMPATSYM(name) \
|
||||||
|
do { \
|
||||||
|
m->gm_mech.gm_compat->gmc_ ## name = dlsym(so, "gss_" #name); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -283,28 +293,23 @@ _gss_load_mech(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
so = dlopen(lib, RTLD_LAZY | RTLD_LOCAL | RTLD_GROUP);
|
so = dlopen(lib, RTLD_LAZY | RTLD_LOCAL | RTLD_GROUP);
|
||||||
if (!so) {
|
if (so == NULL) {
|
||||||
/* fprintf(stderr, "dlopen: %s\n", dlerror()); */
|
/* fprintf(stderr, "dlopen: %s\n", dlerror()); */
|
||||||
free(mech_oid.elements);
|
goto bad;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m = malloc(sizeof(*m));
|
m = calloc(1, sizeof(*m));
|
||||||
if (!m) {
|
if (m == NULL)
|
||||||
free(mech_oid.elements);
|
goto bad;
|
||||||
break;
|
|
||||||
}
|
|
||||||
m->gm_so = so;
|
m->gm_so = so;
|
||||||
m->gm_mech.gm_mech_oid = mech_oid;
|
m->gm_mech.gm_mech_oid = mech_oid;
|
||||||
m->gm_mech.gm_flags = 0;
|
m->gm_mech.gm_flags = 0;
|
||||||
|
|
||||||
major_status = gss_add_oid_set_member(&minor_status,
|
major_status = gss_add_oid_set_member(&minor_status,
|
||||||
&m->gm_mech.gm_mech_oid, &_gss_mech_oids);
|
&m->gm_mech.gm_mech_oid, &_gss_mech_oids);
|
||||||
if (major_status) {
|
if (GSS_ERROR(major_status))
|
||||||
free(m->gm_mech.gm_mech_oid.elements);
|
goto bad;
|
||||||
free(m);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
SYM(acquire_cred);
|
SYM(acquire_cred);
|
||||||
SYM(release_cred);
|
SYM(release_cred);
|
||||||
@@ -338,7 +343,7 @@ _gss_load_mech(void)
|
|||||||
OPTSYM(inquire_cred_by_oid);
|
OPTSYM(inquire_cred_by_oid);
|
||||||
OPTSYM(inquire_sec_context_by_oid);
|
OPTSYM(inquire_sec_context_by_oid);
|
||||||
OPTSYM(set_sec_context_option);
|
OPTSYM(set_sec_context_option);
|
||||||
OPTSYM(set_cred_option);
|
OPTSPISYM(set_cred_option);
|
||||||
OPTSYM(pseudo_random);
|
OPTSYM(pseudo_random);
|
||||||
OPTSYM(wrap_iov);
|
OPTSYM(wrap_iov);
|
||||||
OPTSYM(unwrap_iov);
|
OPTSYM(unwrap_iov);
|
||||||
@@ -352,20 +357,29 @@ _gss_load_mech(void)
|
|||||||
|
|
||||||
mi = dlsym(so, "gss_mo_init");
|
mi = dlsym(so, "gss_mo_init");
|
||||||
if (mi != NULL) {
|
if (mi != NULL) {
|
||||||
major_status = mi(&minor_status,
|
major_status = mi(&minor_status, &mech_oid,
|
||||||
&mech_oid,
|
&m->gm_mech.gm_mo, &m->gm_mech.gm_mo_num);
|
||||||
&m->gm_mech.gm_mo,
|
|
||||||
&m->gm_mech.gm_mo_num);
|
|
||||||
if (GSS_ERROR(major_status))
|
if (GSS_ERROR(major_status))
|
||||||
goto bad;
|
goto bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* pick up the oid sets of names */
|
||||||
|
|
||||||
|
if (m->gm_mech.gm_inquire_names_for_mech)
|
||||||
|
(*m->gm_mech.gm_inquire_names_for_mech)(&minor_status,
|
||||||
|
&m->gm_mech.gm_mech_oid, &m->gm_name_types);
|
||||||
|
|
||||||
|
if (m->gm_name_types == NULL)
|
||||||
|
gss_create_empty_oid_set(&minor_status, &m->gm_name_types);
|
||||||
|
|
||||||
HEIM_SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link);
|
HEIM_SLIST_INSERT_HEAD(&_gss_mechs, m, gm_link);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
free(m->gm_mech.gm_mech_oid.elements);
|
if (m != NULL) {
|
||||||
free(m);
|
free(m->gm_mech.gm_mech_oid.elements);
|
||||||
|
free(m);
|
||||||
|
}
|
||||||
dlclose(so);
|
dlclose(so);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user