From 70b34b424a049586b4cdb5a6646b3ee1700c11c6 Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Fri, 8 Aug 1997 14:10:29 +0000 Subject: [PATCH] clean-up and try to free memory even when there're errors git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2809 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/krb5/get_cred.c | 213 +++++++++++++++++++++++++++++--------------- 1 file changed, 140 insertions(+), 73 deletions(-) diff --git a/lib/krb5/get_cred.c b/lib/krb5/get_cred.c index 7041405d3..6b6ab9e84 100644 --- a/lib/krb5/get_cred.c +++ b/lib/krb5/get_cred.c @@ -42,7 +42,6 @@ RCSID("$Id$"); static krb5_error_code make_pa_tgs_req(krb5_context context, - krb5_ccache id, KDC_REQ_BODY *body, PA_DATA *padata, krb5_creds *creds) @@ -64,6 +63,118 @@ make_pa_tgs_req(krb5_context context, return 0; } +static krb5_error_code +init_tgs_req (krb5_context context, + krb5_ccache ccache, + krb5_addresses *addresses, + krb5_kdc_flags flags, + Ticket *second_ticket, + krb5_creds *in_creds, + krb5_creds *krbtgt, + unsigned nonce, + TGS_REQ *t) +{ + krb5_error_code ret; + + memset(t, 0, sizeof(*t)); + t->pvno = 5; + t->msg_type = krb_tgs_req; + ret = krb5_init_etype(context, + &t->req_body.etype.len, + &t->req_body.etype.val, + NULL); + if (ret) + goto fail; + t->req_body.addresses = addresses; + t->req_body.kdc_options = flags.b; + ret = copy_Realm(&in_creds->server->realm, &t->req_body.realm); + if (ret) + goto fail; + t->req_body.sname = malloc(sizeof(*t->req_body.sname)); + if (t->req_body.sname == NULL) { + ret = ENOMEM; + goto fail; + } + ret = copy_PrincipalName(&in_creds->server->name, t->req_body.sname); + if (ret) + goto fail; + + t->req_body.till = in_creds->times.endtime; + + t->req_body.nonce = nonce; + if(second_ticket){ + ALLOC(t->req_body.additional_tickets, 1); + if (t->req_body.additional_tickets == NULL) { + ret = ENOMEM; + goto fail; + } + t->req_body.additional_tickets->len = 1; + ALLOC(t->req_body.additional_tickets->val, 1); + if (t->req_body.additional_tickets->val == NULL) { + ret = ENOMEM; + goto fail; + } + ret = copy_Ticket(second_ticket, t->req_body.additional_tickets->val); + if (ret) + goto fail; + } + t->req_body.enc_authorization_data = NULL; + + t->padata = malloc(sizeof(*t->padata)); + if (t->padata == NULL) { + ret = ENOMEM; + goto fail; + } + t->padata->len = 1; + t->padata->val = malloc(sizeof(*t->padata->val)); + if (t->padata->val == NULL) { + ret = ENOMEM; + goto fail; + } + + ret = make_pa_tgs_req(context, + &t->req_body, + t->padata->val, + krbtgt); + if(ret) + goto fail; + return 0; +fail: + free_TGS_REQ (t); + return ret; +} + +static krb5_error_code +get_krbtgt(krb5_context context, + krb5_ccache id, + krb5_realm realm, + krb5_creds **cred) +{ + krb5_error_code ret; + krb5_creds tmp_cred; + + memset(&tmp_cred, 0, sizeof(tmp_cred)); + ret = krb5_build_principal(context, + &tmp_cred.server, + strlen(realm), + realm, + "krbtgt", + realm, + NULL); + if(ret) + return ret; + ret = krb5_get_credentials(context, + 0, /* CACHE_ONLY */ + id, + &tmp_cred, + cred); + krb5_free_principal(context, tmp_cred.server); + if(ret) + return ret; + return 0; +} + + krb5_error_code krb5_get_kdc_cred(krb5_context context, krb5_ccache id, @@ -85,64 +196,36 @@ krb5_get_kdc_cred(krb5_context context, unsigned char buf[1024]; size_t len; - memset(&req, 0, sizeof(req)); - req.pvno = 5; - req.msg_type = krb_tgs_req; - krb5_init_etype(context, - &req.req_body.etype.len, - &req.req_body.etype.val, - NULL); - req.req_body.addresses = addresses; - req.req_body.kdc_options = flags.b; - copy_Realm(&in_creds->server->realm, &req.req_body.realm); - req.req_body.sname = malloc(sizeof(*req.req_body.sname)); - copy_PrincipalName(&in_creds->server->name, req.req_body.sname); - req.req_body.till = in_creds->times.endtime; - - krb5_generate_random_block(&nonce, sizeof(nonce)); - req.req_body.nonce = nonce; - if(second_ticket){ - ALLOC(req.req_body.additional_tickets, 1); - req.req_body.additional_tickets->len = 1; - ALLOC(req.req_body.additional_tickets->val, 1); - copy_Ticket(second_ticket, req.req_body.additional_tickets->val); - } - req.req_body.enc_authorization_data = NULL; - - req.padata = malloc(sizeof(*req.padata)); - req.padata->len = 1; - req.padata->val = malloc(sizeof(*req.padata->val)); - { - krb5_creds tmp_cred; - memset(&tmp_cred, 0, sizeof(tmp_cred)); - ret = krb5_build_principal(context, - &tmp_cred.server, - strlen(req.req_body.realm), - req.req_body.realm, - "krbtgt", - req.req_body.realm, - NULL); - if(ret) - return ret; - ret = krb5_get_credentials(context, - 0, /* CACHE_ONLY */ - id, - &tmp_cred, - &krbtgt); - krb5_free_principal(context, tmp_cred.server); - if(ret) - return ret; - } + ret = get_krbtgt (context, + id, + in_creds->server->realm, + &krbtgt); + if (ret) + return ret; - ret = make_pa_tgs_req(context, id, &req.req_body, - req.padata->val, krbtgt); - if(ret) + ret = init_tgs_req (context, + id, + addresses, + flags, + second_ticket, + in_creds, + krbtgt, + nonce, + &req); + if (ret) goto out; - - encode_TGS_REQ (buf + sizeof (buf) - 1, sizeof(buf), &req, &enc.length); + + ret = encode_TGS_REQ (buf + sizeof (buf) - 1, sizeof(buf), + &req, &enc.length); + /* Don't free this part, it's from the caller */ + req.req_body.addresses = NULL; + free_TGS_REQ(&req); + enc.data = buf + sizeof(buf) - enc.length; + if (ret) + goto out; /* * Send and receive @@ -172,33 +255,17 @@ krb5_get_kdc_cred(krb5_context context, nonce, NULL, NULL); - krb5_free_creds(context, krbtgt); - if(ret == 0 && rep.part2.nonce != req.req_body.nonce) - ret = KRB5KRB_AP_ERR_MODIFIED; krb5_free_kdc_rep(context, &rep); + if (ret) + goto out; }else if(krb5_rd_error(context, &resp, &error) == 0){ -#if 0 - krb5_principal princ; - char *name; - principalname2krb5_principal(&princ, error.sname, error.realm); - krb5_unparse_name(context, princ, &name); - fprintf(stderr, "Error: %s ", name); - if(error.e_text) - fprintf(stderr, "%s", *error.e_text); - else - fprintf(stderr, "%s", - krb5_get_err_text(context, error.error_code)); - fprintf(stderr, " (code %d)\n", error.error_code); -#endif ret = error.error_code; free_KRB_ERROR(&error); }else ret = KRB5KRB_AP_ERR_MSG_TYPE; krb5_data_free(&resp); out: - /* Don't free this part, it's from the caller */ - req.req_body.addresses = NULL; - free_TGS_REQ(&req); + krb5_free_creds (context, krbtgt); return ret; }