static int add_mech_type(gss_OID mech_type, int includeMSCompatOID, MechTypeList *mechtypelist) { MechType mech; int ret; if (gss_oid_equal(mech_type, GSS_SPNEGO_MECHANISM)) return 0; if (includeMSCompatOID && gss_oid_equal(mech_type, &_gss_spnego_krb5_mechanism_oid_desc)) { ret = der_get_oid(_gss_spnego_mskrb_mechanism_oid_desc.elements, _gss_spnego_mskrb_mechanism_oid_desc.length, &mech, NULL); if (ret) return ret; ret = add_MechTypeList(mechtypelist, &mech); free_MechType(&mech); if (ret) return ret; } ret = der_get_oid(mech_type->elements, mech_type->length, &mech, NULL); if (ret) return ret; ret = add_MechTypeList(mechtypelist, &mech); free_MechType(&mech); return ret; }
static void free_MechTypeList(MechTypeList * data) { while ((data)->len) { free_MechType(&(data)->val[(data)->len - 1]); (data)->len--; } free((data)->val); (data)->val = NULL; }
int decode_MechType(const unsigned char *p, size_t len, MechType *data, size_t *size) { size_t ret = 0; size_t l; int e; memset(data, 0, sizeof(*data)); e = decode_oid(p, len, data, &l); FORW; if(size) *size = ret; return 0; fail: free_MechType(data); return e; }
static void free_NegTokenResp(NegTokenResp * data) { if ((data)->negState) { free((data)->negState); (data)->negState = NULL; } if ((data)->supportedMech) { free_MechType((data)->supportedMech); free((data)->supportedMech); (data)->supportedMech = NULL; } if ((data)->responseToken) { free_octet_string((data)->responseToken); free((data)->responseToken); (data)->responseToken = NULL; } if ((data)->mechListMIC) { free_octet_string((data)->mechListMIC); free((data)->mechListMIC); (data)->mechListMIC = NULL; } }