1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/krb5/krb/kfree.c */
4 * Copyright 1990-1998, 2009 by the Massachusetts Institute of Technology.
6 * Export of this software from the United States of America may
7 * require a specific license from the United States Government.
8 * It is the responsibility of any person or organization contemplating
9 * export to obtain such a license before exporting.
11 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
12 * distribute this software and its documentation for any purpose and
13 * without fee is hereby granted, provided that the above copyright
14 * notice appear in all copies and that both that copyright notice and
15 * this permission notice appear in supporting documentation, and that
16 * the name of M.I.T. not be used in advertising or publicity pertaining
17 * to distribution of the software without specific, written prior
18 * permission. Furthermore if you modify this software you must label
19 * your software as modified software and not distribute it in such a
20 * fashion that it might be confused with the original M.I.T. software.
21 * M.I.T. makes no representations about the suitability of
22 * this software for any purpose. It is provided "as is" without express
23 * or implied warranty.
26 * Copyright (c) 2006-2008, Novell, Inc.
27 * All rights reserved.
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions are met:
32 * * Redistributions of source code must retain the above copyright notice,
33 * this list of conditions and the following disclaimer.
34 * * Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * * The copyright holder's name is not used to endorse or promote products
38 * derived from this software without specific prior written permission.
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
41 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
44 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
45 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
46 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
47 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
48 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
50 * POSSIBILITY OF SUCH DAMAGE.
57 krb5_free_address(krb5_context context, krb5_address *val)
66 krb5_free_addresses(krb5_context context, krb5_address **val)
68 register krb5_address **temp;
72 for (temp = val; *temp; temp++) {
73 free((*temp)->contents);
81 krb5_free_alt_method(krb5_context context,
90 krb5_free_ap_rep(krb5_context context, register krb5_ap_rep *val)
94 free(val->enc_part.ciphertext.data);
99 krb5_free_ap_req(krb5_context context, register krb5_ap_req *val)
103 krb5_free_ticket(context, val->ticket);
104 free(val->authenticator.ciphertext.data);
109 krb5_free_ap_rep_enc_part(krb5_context context, krb5_ap_rep_enc_part *val)
113 krb5_free_keyblock(context, val->subkey);
118 krb5_free_authenticator_contents(krb5_context context, krb5_authenticator *val)
122 krb5_free_checksum(context, val->checksum);
124 krb5_free_principal(context, val->client);
126 krb5_free_keyblock(context, val->subkey);
128 krb5_free_authdata(context, val->authorization_data);
129 val->authorization_data = 0;
133 krb5_free_authenticator(krb5_context context, krb5_authenticator *val)
137 krb5_free_authenticator_contents(context, val);
142 krb5_free_checksum(krb5_context context, register krb5_checksum *val)
146 krb5_free_checksum_contents(context, val);
151 krb5_free_checksum_contents(krb5_context context, register krb5_checksum *val)
156 val->contents = NULL;
160 krb5_free_cred(krb5_context context, register krb5_cred *val)
164 krb5_free_tickets(context, val->tickets);
165 free(val->enc_part.ciphertext.data);
170 * krb5_free_cred_contents zeros out the session key, and then frees
171 * the credentials structures
175 krb5_free_cred_contents(krb5_context context, krb5_creds *val)
179 krb5_free_principal(context, val->client);
181 krb5_free_principal(context, val->server);
183 krb5_free_keyblock_contents(context, &val->keyblock);
184 free(val->ticket.data);
185 val->ticket.data = 0;
186 free(val->second_ticket.data);
187 val->second_ticket.data = 0;
188 krb5_free_addresses(context, val->addresses);
190 krb5_free_authdata(context, val->authdata);
195 krb5_free_cred_enc_part(krb5_context context, register krb5_cred_enc_part *val)
197 register krb5_cred_info **temp;
201 krb5_free_address(context, val->r_address);
203 krb5_free_address(context, val->s_address);
206 if (val->ticket_info) {
207 for (temp = val->ticket_info; *temp; temp++) {
208 krb5_free_keyblock(context, (*temp)->session);
209 krb5_free_principal(context, (*temp)->client);
210 krb5_free_principal(context, (*temp)->server);
211 krb5_free_addresses(context, (*temp)->caddrs);
214 free(val->ticket_info);
215 val->ticket_info = 0;
221 krb5_free_creds(krb5_context context, krb5_creds *val)
225 krb5_free_cred_contents(context, val);
231 krb5_free_data(krb5_context context, krb5_data *val)
241 krb5_free_octet_data(krb5_context context, krb5_octet_data *val)
250 krb5_free_data_contents(krb5_context context, krb5_data *val)
261 krb5_free_enc_data(krb5_context context, krb5_enc_data *val)
265 krb5_free_data_contents(context, &val->ciphertext);
269 void krb5_free_etype_info(krb5_context context, krb5_etype_info info)
275 for (i=0; info[i] != NULL; i++) {
277 krb5_free_data_contents(context, &info[i]->s2kparams);
285 krb5_free_enc_kdc_rep_part(krb5_context context, register krb5_enc_kdc_rep_part *val)
289 krb5_free_keyblock(context, val->session);
290 krb5_free_last_req(context, val->last_req);
291 krb5_free_principal(context, val->server);
292 krb5_free_addresses(context, val->caddrs);
293 krb5_free_pa_data(context, val->enc_padata);
298 krb5_free_enc_tkt_part(krb5_context context, krb5_enc_tkt_part *val)
302 krb5_free_keyblock(context, val->session);
303 krb5_free_principal(context, val->client);
304 free(val->transited.tr_contents.data);
305 krb5_free_addresses(context, val->caddrs);
306 krb5_free_authdata(context, val->authorization_data);
312 krb5_free_error(krb5_context context, register krb5_error *val)
316 krb5_free_principal(context, val->client);
317 krb5_free_principal(context, val->server);
318 free(val->text.data);
319 free(val->e_data.data);
324 krb5_free_kdc_rep(krb5_context context, krb5_kdc_rep *val)
328 krb5_free_pa_data(context, val->padata);
329 krb5_free_principal(context, val->client);
330 krb5_free_ticket(context, val->ticket);
331 free(val->enc_part.ciphertext.data);
332 krb5_free_enc_kdc_rep_part(context, val->enc_part2);
338 krb5_free_kdc_req(krb5_context context, krb5_kdc_req *val)
342 krb5_free_pa_data(context, val->padata);
343 krb5_free_principal(context, val->client);
344 krb5_free_principal(context, val->server);
346 krb5_free_addresses(context, val->addresses);
347 free(val->authorization_data.ciphertext.data);
348 krb5_free_authdata(context, val->unenc_authdata);
349 krb5_free_tickets(context, val->second_ticket);
354 krb5_free_keyblock_contents(krb5_context context, register krb5_keyblock *key)
356 krb5int_c_free_keyblock_contents (context, key);
360 krb5_free_keyblock(krb5_context context, register krb5_keyblock *val)
362 krb5int_c_free_keyblock (context, val);
368 krb5_free_last_req(krb5_context context, krb5_last_req_entry **val)
370 register krb5_last_req_entry **temp;
374 for (temp = val; *temp; temp++)
380 krb5_free_pa_data(krb5_context context, krb5_pa_data **val)
382 register krb5_pa_data **temp;
386 for (temp = val; *temp; temp++) {
387 free((*temp)->contents);
394 krb5_free_principal(krb5_context context, krb5_principal val)
396 register krb5_int32 i;
402 i = krb5_princ_size(context, val);
404 free(krb5_princ_component(context, val, i)->data);
407 free(val->realm.data);
412 krb5_free_priv(krb5_context context, register krb5_priv *val)
416 free(val->enc_part.ciphertext.data);
421 krb5_free_priv_enc_part(krb5_context context, register krb5_priv_enc_part *val)
425 free(val->user_data.data);
426 krb5_free_address(context, val->r_address);
427 krb5_free_address(context, val->s_address);
432 krb5_free_pwd_data(krb5_context context, krb5_pwd_data *val)
436 krb5_free_pwd_sequences(context, val->element);
442 krb5_free_passwd_phrase_element(krb5_context context,
443 passwd_phrase_element *val)
447 krb5_free_data(context, val->passwd);
449 krb5_free_data(context, val->phrase);
456 krb5_free_pwd_sequences(krb5_context context, passwd_phrase_element **val)
458 register passwd_phrase_element **temp;
462 for (temp = val; *temp; temp++)
463 krb5_free_passwd_phrase_element(context, *temp);
469 krb5_free_safe(krb5_context context, register krb5_safe *val)
473 free(val->user_data.data);
474 krb5_free_address(context, val->r_address);
475 krb5_free_address(context, val->s_address);
476 krb5_free_checksum(context, val->checksum);
482 krb5_free_ticket(krb5_context context, krb5_ticket *val)
486 krb5_free_principal(context, val->server);
487 free(val->enc_part.ciphertext.data);
488 krb5_free_enc_tkt_part(context, val->enc_part2);
493 krb5_free_tickets(krb5_context context, krb5_ticket **val)
495 register krb5_ticket **temp;
499 for (temp = val; *temp; temp++)
500 krb5_free_ticket(context, *temp);
506 krb5_free_tgt_creds(krb5_context context, krb5_creds **tgts)
508 register krb5_creds **tgtpp;
511 for (tgtpp = tgts; *tgtpp; tgtpp++)
512 krb5_free_creds(context, *tgtpp);
517 krb5_free_tkt_authent(krb5_context context, krb5_tkt_authent *val)
521 krb5_free_ticket(context, val->ticket);
522 krb5_free_authenticator(context, val->authenticator);
527 krb5_free_unparsed_name(krb5_context context, char *val)
534 krb5_free_string(krb5_context context, char *val)
540 krb5_free_sam_challenge(krb5_context ctx, krb5_sam_challenge *sc)
544 krb5_free_sam_challenge_contents(ctx, sc);
549 krb5_free_sam_challenge_2(krb5_context ctx, krb5_sam_challenge_2 *sc2)
553 krb5_free_sam_challenge_2_contents(ctx, sc2);
558 krb5_free_sam_challenge_contents(krb5_context ctx, krb5_sam_challenge *sc)
562 if (sc->sam_type_name.data)
563 krb5_free_data_contents(ctx, &sc->sam_type_name);
564 if (sc->sam_track_id.data)
565 krb5_free_data_contents(ctx, &sc->sam_track_id);
566 if (sc->sam_challenge_label.data)
567 krb5_free_data_contents(ctx, &sc->sam_challenge_label);
568 if (sc->sam_challenge.data)
569 krb5_free_data_contents(ctx, &sc->sam_challenge);
570 if (sc->sam_response_prompt.data)
571 krb5_free_data_contents(ctx, &sc->sam_response_prompt);
572 if (sc->sam_pk_for_sad.data)
573 krb5_free_data_contents(ctx, &sc->sam_pk_for_sad);
574 free(sc->sam_cksum.contents);
575 sc->sam_cksum.contents = 0;
579 krb5_free_sam_challenge_2_contents(krb5_context ctx,
580 krb5_sam_challenge_2 *sc2)
582 krb5_checksum **cksump;
586 if (sc2->sam_challenge_2_body.data)
587 krb5_free_data_contents(ctx, &sc2->sam_challenge_2_body);
588 if (sc2->sam_cksum) {
589 cksump = sc2->sam_cksum;
591 krb5_free_checksum(ctx, *cksump);
594 free(sc2->sam_cksum);
600 krb5_free_sam_challenge_2_body(krb5_context ctx,
601 krb5_sam_challenge_2_body *sc2)
605 krb5_free_sam_challenge_2_body_contents(ctx, sc2);
610 krb5_free_sam_challenge_2_body_contents(krb5_context ctx,
611 krb5_sam_challenge_2_body *sc2)
615 if (sc2->sam_type_name.data)
616 krb5_free_data_contents(ctx, &sc2->sam_type_name);
617 if (sc2->sam_track_id.data)
618 krb5_free_data_contents(ctx, &sc2->sam_track_id);
619 if (sc2->sam_challenge_label.data)
620 krb5_free_data_contents(ctx, &sc2->sam_challenge_label);
621 if (sc2->sam_challenge.data)
622 krb5_free_data_contents(ctx, &sc2->sam_challenge);
623 if (sc2->sam_response_prompt.data)
624 krb5_free_data_contents(ctx, &sc2->sam_response_prompt);
625 if (sc2->sam_pk_for_sad.data)
626 krb5_free_data_contents(ctx, &sc2->sam_pk_for_sad);
630 krb5_free_sam_response(krb5_context ctx, krb5_sam_response *sr)
634 krb5_free_sam_response_contents(ctx, sr);
639 krb5_free_sam_response_2(krb5_context ctx, krb5_sam_response_2 *sr2)
643 krb5_free_sam_response_2_contents(ctx, sr2);
648 krb5_free_sam_response_contents(krb5_context ctx, krb5_sam_response *sr)
652 if (sr->sam_track_id.data)
653 krb5_free_data_contents(ctx, &sr->sam_track_id);
654 if (sr->sam_enc_key.ciphertext.data)
655 krb5_free_data_contents(ctx, &sr->sam_enc_key.ciphertext);
656 if (sr->sam_enc_nonce_or_ts.ciphertext.data)
657 krb5_free_data_contents(ctx, &sr->sam_enc_nonce_or_ts.ciphertext);
661 krb5_free_sam_response_2_contents(krb5_context ctx, krb5_sam_response_2 *sr2)
665 if (sr2->sam_track_id.data)
666 krb5_free_data_contents(ctx, &sr2->sam_track_id);
667 if (sr2->sam_enc_nonce_or_sad.ciphertext.data)
668 krb5_free_data_contents(ctx, &sr2->sam_enc_nonce_or_sad.ciphertext);
672 krb5_free_predicted_sam_response(krb5_context ctx,
673 krb5_predicted_sam_response *psr)
677 krb5_free_predicted_sam_response_contents(ctx, psr);
682 krb5_free_predicted_sam_response_contents(krb5_context ctx,
683 krb5_predicted_sam_response *psr)
687 if (psr->sam_key.contents)
688 krb5_free_keyblock_contents(ctx, &psr->sam_key);
689 krb5_free_principal(ctx, psr->client);
692 krb5_free_data_contents(ctx, &psr->msd);
696 krb5_free_enc_sam_response_enc(krb5_context ctx,
697 krb5_enc_sam_response_enc *esre)
701 krb5_free_enc_sam_response_enc_contents(ctx, esre);
706 krb5_free_enc_sam_response_enc_2(krb5_context ctx,
707 krb5_enc_sam_response_enc_2 *esre2)
711 krb5_free_enc_sam_response_enc_2_contents(ctx, esre2);
716 krb5_free_enc_sam_response_enc_contents(krb5_context ctx,
717 krb5_enc_sam_response_enc *esre)
721 if (esre->sam_sad.data)
722 krb5_free_data_contents(ctx, &esre->sam_sad);
726 krb5_free_enc_sam_response_enc_2_contents(krb5_context ctx,
727 krb5_enc_sam_response_enc_2 *esre2)
731 if (esre2->sam_sad.data)
732 krb5_free_data_contents(ctx, &esre2->sam_sad);
736 krb5_free_pa_enc_ts(krb5_context ctx, krb5_pa_enc_ts *pa_enc_ts)
744 krb5_free_pa_for_user(krb5_context context, krb5_pa_for_user *req)
748 krb5_free_principal(context, req->user);
750 krb5_free_checksum_contents(context, &req->cksum);
751 krb5_free_data_contents(context, &req->auth_package);
756 krb5_free_s4u_userid_contents(krb5_context context, krb5_s4u_userid *user_id)
761 krb5_free_principal(context, user_id->user);
762 user_id->user = NULL;
763 krb5_free_data_contents(context, &user_id->subject_cert);
764 user_id->subject_cert.length = 0;
765 user_id->subject_cert.data = NULL;
766 user_id->options = 0;
770 krb5_free_pa_s4u_x509_user(krb5_context context, krb5_pa_s4u_x509_user *req)
774 krb5_free_s4u_userid_contents(context, &req->user_id);
775 krb5_free_checksum_contents(context, &req->cksum);
780 krb5_free_pa_server_referral_data(krb5_context context,
781 krb5_pa_server_referral_data *ref)
785 krb5_free_data(context, ref->referred_realm);
786 ref->referred_realm = NULL;
787 krb5_free_principal(context, ref->true_principal_name);
788 ref->true_principal_name = NULL;
789 krb5_free_principal(context, ref->requested_principal_name);
790 ref->requested_principal_name = NULL;
791 krb5_free_checksum_contents(context, &ref->rep_cksum);
796 krb5_free_pa_svr_referral_data(krb5_context context,
797 krb5_pa_svr_referral_data *ref)
801 krb5_free_principal(context, ref->principal);
802 ref->principal = NULL;
807 krb5_free_pa_pac_req(krb5_context context,
808 krb5_pa_pac_req *req)
814 krb5_free_etype_list(krb5_context context,
815 krb5_etype_list *etypes)
817 if (etypes != NULL) {
818 free(etypes->etypes);
823 krb5_free_fast_req(krb5_context context, krb5_fast_req *val)
827 krb5_free_kdc_req(context, val->req_body);
832 krb5_free_fast_armor(krb5_context context, krb5_fast_armor *val)
836 krb5_free_data_contents(context, &val->armor_value);
841 krb5_free_fast_response(krb5_context context, krb5_fast_response *val)
845 krb5_free_pa_data(context, val->padata);
846 krb5_free_fast_finished(context, val->finished);
847 krb5_free_keyblock(context, val->strengthen_key);
852 krb5_free_fast_finished(krb5_context context, krb5_fast_finished *val)
856 krb5_free_principal(context, val->client);
857 krb5_free_checksum_contents(context, &val->ticket_checksum);
862 krb5_free_typed_data(krb5_context context, krb5_typed_data **in)
865 if (in == NULL) return;
866 while (in[i] != NULL) {
867 if (in[i]->data != NULL)
876 krb5_free_fast_armored_req(krb5_context context, krb5_fast_armored_req *val)
881 krb5_free_fast_armor(context, val->armor);
882 krb5_free_data_contents(context, &val->enc_part.ciphertext);
883 if (val->req_checksum.contents)
884 krb5_free_checksum_contents(context, &val->req_checksum);
889 krb5int_free_data_list(krb5_context context, krb5_data *data)
896 for (i = 0; data[i].data != NULL; i++)
903 krb5_free_ad_kdcissued(krb5_context context, krb5_ad_kdcissued *val)
908 krb5_free_checksum_contents(context, &val->ad_checksum);
909 krb5_free_principal(context, val->i_principal);
910 krb5_free_authdata(context, val->elements);
915 krb5_free_ad_signedpath(krb5_context context, krb5_ad_signedpath *val)
922 krb5_free_checksum_contents(context, &val->checksum);
923 if (val->delegated != NULL) {
924 for (i = 0; val->delegated[i] != NULL; i++)
925 krb5_free_principal(context, val->delegated[i]);
926 free(val->delegated);
928 krb5_free_pa_data(context, val->method_data);
933 krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val)
938 krb5_free_data_contents(context, &val->target_realm);
939 krb5_free_data(context, val->cookie);
944 krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val)
949 krb5_free_checksum_contents(context, &val->checksum);