From: Sam Hartman Date: Thu, 26 Mar 2009 05:36:23 +0000 (+0000) Subject: kdc_req_body in fast_req should be a pointer X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0f39f5625926aedaa81f74d248d4abff80fee5c;p=thirdparty%2Fkrb5.git kdc_req_body in fast_req should be a pointer The req_body needs to be a pointer so after FAST processing it can replace the request. git-svn-id: svn://anonsvn.mit.edu/krb5/branches/fast@22119 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/include/k5-int.h b/src/include/k5-int.h index bf7cc567dd..4dbc8d300e 100644 --- a/src/include/k5-int.h +++ b/src/include/k5-int.h @@ -978,7 +978,7 @@ typedef struct _krb5_fast_req { krb5_magic magic; krb5_int32 fast_options; /* padata from req_body is used*/ - krb5_kdc_req req_body; + krb5_kdc_req *req_body; } krb5_fast_req; typedef struct _krb5_fast_finished { @@ -1614,6 +1614,9 @@ krb5_error_code encode_krb5_fast_req krb5_error_code encode_krb5_pa_fx_fast_reply (const krb5_enc_data *, krb5_data **); +krb5_error_code encode_krb5_fast_response +(const krb5_fast_response *, krb5_data **); + /************************************************************************* * End of prototypes for krb5_encode.c *************************************************************************/ diff --git a/src/lib/krb5/asn.1/asn1_k_encode.c b/src/lib/krb5/asn.1/asn1_k_encode.c index 73da21ae91..1ce4c29d26 100644 --- a/src/lib/krb5/asn.1/asn1_k_encode.c +++ b/src/lib/krb5/asn.1/asn1_k_encode.c @@ -338,6 +338,8 @@ asn1_encode_kdc_req_body(asn1buf *buf, const krb5_kdc_req *val, DEFFNXTYPE(kdc_req_body, krb5_kdc_req, asn1_encode_kdc_req_body); /* end ugly hack */ +DEFPTRTYPE(ptr_kdc_req_body,kdc_req_body); + static const struct field_info transited_fields[] = { FIELDOF_NORM(krb5_transited, octet, tr_type, 0), FIELDOF_NORM(krb5_transited, ostring_data, tr_contents, 1), @@ -1204,10 +1206,14 @@ DEFSEQTYPE( fast_armored_req, krb5_fast_armored_req, fast_armored_req_fields, fa DEFFIELDTYPE( pa_fx_fast_request, krb5_fast_armored_req, FIELDOF_ENCODEAS( krb5_fast_armored_req, fast_armored_req, 0)); +DEFFIELDTYPE(fast_req_padata, krb5_kdc_req, + FIELDOF_NORM(krb5_kdc_req, ptr_seqof_pa_data, padata, -1)); +DEFPTRTYPE(ptr_fast_req_padata, fast_req_padata); + static const struct field_info fast_req_fields[] = { FIELDOF_NORM(krb5_fast_req, int32, fast_options, 0), - FIELDOF_NORM( krb5_fast_req, ptr_seqof_pa_data, req_body.padata, 1), - FIELDOF_NORM( krb5_fast_req, kdc_req_body, req_body, 2), + FIELDOF_NORM( krb5_fast_req, ptr_fast_req_padata, req_body, 1), + FIELDOF_NORM( krb5_fast_req, ptr_kdc_req_body, req_body, 2), }; DEFSEQTYPE(fast_req, krb5_fast_req, fast_req_fields, 0); diff --git a/src/lib/krb5/asn.1/krb5_decode.c b/src/lib/krb5/asn.1/krb5_decode.c index caa52f34f1..4a6977c002 100644 --- a/src/lib/krb5/asn.1/krb5_decode.c +++ b/src/lib/krb5/asn.1/krb5_decode.c @@ -1107,18 +1107,24 @@ krb5_error_code decode_krb5_pa_fx_fast_request krb5_error_code decode_krb5_fast_req (const krb5_data *code, krb5_fast_req **repptr) { - setup(krb5_fast_req *); - alloc_field(rep); - clear_field(rep, req_body.padata); - {begin_structure(); - - - get_field(rep->fast_options, 0, asn1_decode_int32); - opt_field(rep->req_body.padata, 1, asn1_decode_sequence_of_pa_data); - get_field(rep->req_body, 2, asn1_decode_kdc_req_body); - end_structure(); } - rep->magic = KV5M_FAST_REQ; - cleanup(free); + setup(krb5_fast_req *); + alloc_field(rep); + alloc_field(rep->req_body); + clear_field(rep, req_body->padata); + {begin_structure(); + get_field(rep->fast_options, 0, asn1_decode_int32); + opt_field(rep->req_body->padata, 1, asn1_decode_sequence_of_pa_data); + get_field(*(rep->req_body), 2, asn1_decode_kdc_req_body); + end_structure(); } + rep->magic = KV5M_FAST_REQ; + cleanup_manual(); + error_out: + if (rep) { + if (rep->req_body) + krb5_free_kdc_req(0, rep->req_body); + free(rep); + } + return retval; } krb5_error_code decode_krb5_fast_response