diff options
author | Volker Lendecke <vlendec@samba.org> | 2003-07-31 10:23:13 +0000 |
---|---|---|
committer | Volker Lendecke <vlendec@samba.org> | 2003-07-31 10:23:13 +0000 |
commit | 2f81ccefa2dcd04da444280924cacac266adfc7a (patch) | |
tree | 60f2495dbd400677992e4d5ab7ed39f5cda1fd90 /source3/libsmb/spnego.c | |
parent | 62ef886beece3c46884ad6b4232755e465d49998 (diff) | |
download | samba-2f81ccefa2dcd04da444280924cacac266adfc7a.tar.gz samba-2f81ccefa2dcd04da444280924cacac266adfc7a.tar.bz2 samba-2f81ccefa2dcd04da444280924cacac266adfc7a.zip |
This fixes an error I must have made when playing with spnego.c found
by aliguori: NegTokenInit.mechListMIC is an Octet String.
Second: add a free_spnego_data function.
Both thanks to aliguori.
Volker
(This used to be commit 6c252440fba33eb69827d5515a95fbb3e8e9a653)
Diffstat (limited to 'source3/libsmb/spnego.c')
-rw-r--r-- | source3/libsmb/spnego.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/source3/libsmb/spnego.c b/source3/libsmb/spnego.c index 078191ffba..267e2f24ff 100644 --- a/source3/libsmb/spnego.c +++ b/source3/libsmb/spnego.c @@ -71,18 +71,7 @@ static BOOL read_negTokenInit(ASN1_DATA *asn1, negTokenInit_t *token) /* Read mecListMIC */ case ASN1_CONTEXT(3): asn1_start_tag(asn1, ASN1_CONTEXT(3)); - if (!asn1_read_OctetString(asn1, &token->mechListMIC)) { - char *mechListMIC; - asn1_push_tag(asn1, ASN1_SEQUENCE(0)); - asn1_push_tag(asn1, ASN1_CONTEXT(0)); - asn1_read_GeneralString(asn1, &mechListMIC); - asn1_pop_tag(asn1); - asn1_pop_tag(asn1); - - token->mechListMIC = - data_blob(mechListMIC, strlen(mechListMIC)); - SAFE_FREE(mechListMIC); - } + asn1_read_OctetString(asn1, &token->mechListMIC); asn1_end_tag(asn1); break; default: @@ -156,8 +145,6 @@ static BOOL read_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token) while (!asn1->has_error && 0 < asn1_tag_remaining(asn1)) { switch (asn1->data[asn1->ofs]) { case ASN1_CONTEXT(0): - /* this is listed as being non-optional by RFC2478 but - Windows doesn't always send it... */ asn1_start_tag(asn1, ASN1_CONTEXT(0)); asn1_start_tag(asn1, ASN1_ENUMERATED); asn1_read_uint8(asn1, &token->negResult); @@ -290,3 +277,37 @@ ssize_t write_spnego_data(DATA_BLOB *blob, SPNEGO_DATA *spnego) return ret; } +BOOL free_spnego_data(SPNEGO_DATA *spnego) +{ + BOOL ret = True; + + if (!spnego) goto out; + + switch(spnego->type) { + case SPNEGO_NEG_TOKEN_INIT: + if (spnego->negTokenInit.mechTypes) { + int i; + for (i = 0; spnego->negTokenInit.mechTypes[i]; i++) { + free(spnego->negTokenInit.mechTypes[i]); + } + free(spnego->negTokenInit.mechTypes); + } + data_blob_free(&spnego->negTokenInit.mechToken); + data_blob_free(&spnego->negTokenInit.mechListMIC); + break; + case SPNEGO_NEG_TOKEN_TARG: + if (spnego->negTokenTarg.supportedMech) { + free(spnego->negTokenTarg.supportedMech); + } + data_blob_free(&spnego->negTokenTarg.responseToken); + data_blob_free(&spnego->negTokenTarg.mechListMIC); + break; + default: + ret = False; + break; + } + ZERO_STRUCTP(spnego); +out: + return ret; +} + |