Imported Upstream version 1.20.1
[platform/upstream/krb5.git] / src / lib / krb5 / krb / kfree.c
index 2a323ec..b4503d2 100644 (file)
@@ -51,6 +51,7 @@
  */
 
 #include "k5-int.h"
+#include "k5-spake.h"
 #include <assert.h>
 
 void KRB5_CALLCONV
@@ -65,7 +66,7 @@ krb5_free_address(krb5_context context, krb5_address *val)
 void KRB5_CALLCONV
 krb5_free_addresses(krb5_context context, krb5_address **val)
 {
-    register krb5_address **temp;
+    krb5_address **temp;
 
     if (val == NULL)
         return;
@@ -76,18 +77,8 @@ krb5_free_addresses(krb5_context context, krb5_address **val)
     free(val);
 }
 
-
-void KRB5_CALLCONV
-krb5_free_alt_method(krb5_context context,
-                     krb5_alt_method *alt)
-{
-    if (alt) {
-        free(alt->data);
-        free(alt);
-    }
-}
 void KRB5_CALLCONV
-krb5_free_ap_rep(krb5_context context, register krb5_ap_rep *val)
+krb5_free_ap_rep(krb5_context context, krb5_ap_rep *val)
 {
     if (val == NULL)
         return;
@@ -96,7 +87,7 @@ krb5_free_ap_rep(krb5_context context, register krb5_ap_rep *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_ap_req(krb5_context context, register krb5_ap_req *val)
+krb5_free_ap_req(krb5_context context, krb5_ap_req *val)
 {
     if (val == NULL)
         return;
@@ -139,7 +130,7 @@ krb5_free_authenticator(krb5_context context, krb5_authenticator *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_checksum(krb5_context context, register krb5_checksum *val)
+krb5_free_checksum(krb5_context context, krb5_checksum *val)
 {
     if (val == NULL)
         return;
@@ -148,16 +139,17 @@ krb5_free_checksum(krb5_context context, register krb5_checksum *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_checksum_contents(krb5_context context, register krb5_checksum *val)
+krb5_free_checksum_contents(krb5_context context, krb5_checksum *val)
 {
     if (val == NULL)
         return;
     free(val->contents);
     val->contents = NULL;
+    val->length = 0;
 }
 
 void KRB5_CALLCONV
-krb5_free_cred(krb5_context context, register krb5_cred *val)
+krb5_free_cred(krb5_context context, krb5_cred *val)
 {
     if (val == NULL)
         return;
@@ -192,9 +184,9 @@ krb5_free_cred_contents(krb5_context context, krb5_creds *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_cred_enc_part(krb5_context context, register krb5_cred_enc_part *val)
+krb5_free_cred_enc_part(krb5_context context, krb5_cred_enc_part *val)
 {
-    register krb5_cred_info **temp;
+    krb5_cred_info **temp;
 
     if (val == NULL)
         return;
@@ -251,10 +243,9 @@ krb5_free_data_contents(krb5_context context, krb5_data *val)
 {
     if (val == NULL)
         return;
-    if (val->data) {
-        free(val->data);
-        val->data = 0;
-    }
+    free(val->data);
+    val->data = NULL;
+    val->length = 0;
 }
 
 void KRB5_CALLCONV
@@ -282,7 +273,7 @@ void krb5_free_etype_info(krb5_context context, krb5_etype_info info)
 
 
 void KRB5_CALLCONV
-krb5_free_enc_kdc_rep_part(krb5_context context, register krb5_enc_kdc_rep_part *val)
+krb5_free_enc_kdc_rep_part(krb5_context context, krb5_enc_kdc_rep_part *val)
 {
     if (val == NULL)
         return;
@@ -309,7 +300,7 @@ krb5_free_enc_tkt_part(krb5_context context, krb5_enc_tkt_part *val)
 
 
 void KRB5_CALLCONV
-krb5_free_error(krb5_context context, register krb5_error *val)
+krb5_free_error(krb5_context context, krb5_error *val)
 {
     if (val == NULL)
         return;
@@ -351,13 +342,13 @@ krb5_free_kdc_req(krb5_context context, krb5_kdc_req *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_keyblock_contents(krb5_context context, register krb5_keyblock *key)
+krb5_free_keyblock_contents(krb5_context context, krb5_keyblock *key)
 {
     krb5int_c_free_keyblock_contents (context, key);
 }
 
 void KRB5_CALLCONV
-krb5_free_keyblock(krb5_context context, register krb5_keyblock *val)
+krb5_free_keyblock(krb5_context context, krb5_keyblock *val)
 {
     krb5int_c_free_keyblock (context, val);
 }
@@ -367,7 +358,7 @@ krb5_free_keyblock(krb5_context context, register krb5_keyblock *val)
 void KRB5_CALLCONV
 krb5_free_last_req(krb5_context context, krb5_last_req_entry **val)
 {
-    register krb5_last_req_entry **temp;
+    krb5_last_req_entry **temp;
 
     if (val == NULL)
         return;
@@ -376,10 +367,24 @@ krb5_free_last_req(krb5_context context, krb5_last_req_entry **val)
     free(val);
 }
 
+void
+k5_zapfree_pa_data(krb5_pa_data **val)
+{
+    krb5_pa_data **pa;
+
+    if (val == NULL)
+        return;
+    for (pa = val; *pa != NULL; pa++) {
+        zapfree((*pa)->contents, (*pa)->length);
+        zapfree(*pa, sizeof(**pa));
+    }
+    free(val);
+}
+
 void KRB5_CALLCONV
 krb5_free_pa_data(krb5_context context, krb5_pa_data **val)
 {
-    register krb5_pa_data **temp;
+    krb5_pa_data **temp;
 
     if (val == NULL)
         return;
@@ -393,15 +398,15 @@ krb5_free_pa_data(krb5_context context, krb5_pa_data **val)
 void KRB5_CALLCONV
 krb5_free_principal(krb5_context context, krb5_principal val)
 {
-    register krb5_int32 i;
+    krb5_int32 i;
 
     if (!val)
         return;
 
     if (val->data) {
-        i = krb5_princ_size(context, val);
+        i = val->length;
         while(--i >= 0)
-            free(krb5_princ_component(context, val, i)->data);
+            free(val->data[i].data);
         free(val->data);
     }
     free(val->realm.data);
@@ -409,7 +414,7 @@ krb5_free_principal(krb5_context context, krb5_principal val)
 }
 
 void KRB5_CALLCONV
-krb5_free_priv(krb5_context context, register krb5_priv *val)
+krb5_free_priv(krb5_context context, krb5_priv *val)
 {
     if (val == NULL)
         return;
@@ -418,7 +423,7 @@ krb5_free_priv(krb5_context context, register krb5_priv *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_priv_enc_part(krb5_context context, register krb5_priv_enc_part *val)
+krb5_free_priv_enc_part(krb5_context context, krb5_priv_enc_part *val)
 {
     if (val == NULL)
         return;
@@ -429,44 +434,7 @@ krb5_free_priv_enc_part(krb5_context context, register krb5_priv_enc_part *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_pwd_data(krb5_context context, krb5_pwd_data *val)
-{
-    if (val == NULL)
-        return;
-    krb5_free_pwd_sequences(context, val->element);
-    free(val);
-}
-
-
-void KRB5_CALLCONV
-krb5_free_passwd_phrase_element(krb5_context context,
-                                passwd_phrase_element *val)
-{
-    if (val == NULL)
-        return;
-    krb5_free_data(context, val->passwd);
-    val->passwd = NULL;
-    krb5_free_data(context, val->phrase);
-    val->phrase = NULL;
-    free(val);
-}
-
-
-void KRB5_CALLCONV
-krb5_free_pwd_sequences(krb5_context context, passwd_phrase_element **val)
-{
-    register passwd_phrase_element **temp;
-
-    if (val == NULL)
-        return;
-    for (temp = val; *temp; temp++)
-        krb5_free_passwd_phrase_element(context, *temp);
-    free(val);
-}
-
-
-void KRB5_CALLCONV
-krb5_free_safe(krb5_context context, register krb5_safe *val)
+krb5_free_safe(krb5_context context, krb5_safe *val)
 {
     if (val == NULL)
         return;
@@ -492,7 +460,7 @@ krb5_free_ticket(krb5_context context, krb5_ticket *val)
 void KRB5_CALLCONV
 krb5_free_tickets(krb5_context context, krb5_ticket **val)
 {
-    register krb5_ticket **temp;
+    krb5_ticket **temp;
 
     if (val == NULL)
         return;
@@ -505,7 +473,7 @@ krb5_free_tickets(krb5_context context, krb5_ticket **val)
 void KRB5_CALLCONV
 krb5_free_tgt_creds(krb5_context context, krb5_creds **tgts)
 {
-    register krb5_creds **tgtpp;
+    krb5_creds **tgtpp;
     if (tgts == NULL)
         return;
     for (tgtpp = tgts; *tgtpp; tgtpp++)
@@ -537,15 +505,6 @@ krb5_free_string(krb5_context context, char *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_sam_challenge(krb5_context ctx, krb5_sam_challenge *sc)
-{
-    if (!sc)
-        return;
-    krb5_free_sam_challenge_contents(ctx, sc);
-    free(sc);
-}
-
-void KRB5_CALLCONV
 krb5_free_sam_challenge_2(krb5_context ctx, krb5_sam_challenge_2 *sc2)
 {
     if (!sc2)
@@ -555,27 +514,6 @@ krb5_free_sam_challenge_2(krb5_context ctx, krb5_sam_challenge_2 *sc2)
 }
 
 void KRB5_CALLCONV
-krb5_free_sam_challenge_contents(krb5_context ctx, krb5_sam_challenge *sc)
-{
-    if (!sc)
-        return;
-    if (sc->sam_type_name.data)
-        krb5_free_data_contents(ctx, &sc->sam_type_name);
-    if (sc->sam_track_id.data)
-        krb5_free_data_contents(ctx, &sc->sam_track_id);
-    if (sc->sam_challenge_label.data)
-        krb5_free_data_contents(ctx, &sc->sam_challenge_label);
-    if (sc->sam_challenge.data)
-        krb5_free_data_contents(ctx, &sc->sam_challenge);
-    if (sc->sam_response_prompt.data)
-        krb5_free_data_contents(ctx, &sc->sam_response_prompt);
-    if (sc->sam_pk_for_sad.data)
-        krb5_free_data_contents(ctx, &sc->sam_pk_for_sad);
-    free(sc->sam_cksum.contents);
-    sc->sam_cksum.contents = 0;
-}
-
-void KRB5_CALLCONV
 krb5_free_sam_challenge_2_contents(krb5_context ctx,
                                    krb5_sam_challenge_2 *sc2)
 {
@@ -627,15 +565,6 @@ krb5_free_sam_challenge_2_body_contents(krb5_context ctx,
 }
 
 void KRB5_CALLCONV
-krb5_free_sam_response(krb5_context ctx, krb5_sam_response *sr)
-{
-    if (!sr)
-        return;
-    krb5_free_sam_response_contents(ctx, sr);
-    free(sr);
-}
-
-void KRB5_CALLCONV
 krb5_free_sam_response_2(krb5_context ctx, krb5_sam_response_2 *sr2)
 {
     if (!sr2)
@@ -645,19 +574,6 @@ krb5_free_sam_response_2(krb5_context ctx, krb5_sam_response_2 *sr2)
 }
 
 void KRB5_CALLCONV
-krb5_free_sam_response_contents(krb5_context ctx, krb5_sam_response *sr)
-{
-    if (!sr)
-        return;
-    if (sr->sam_track_id.data)
-        krb5_free_data_contents(ctx, &sr->sam_track_id);
-    if (sr->sam_enc_key.ciphertext.data)
-        krb5_free_data_contents(ctx, &sr->sam_enc_key.ciphertext);
-    if (sr->sam_enc_nonce_or_ts.ciphertext.data)
-        krb5_free_data_contents(ctx, &sr->sam_enc_nonce_or_ts.ciphertext);
-}
-
-void KRB5_CALLCONV
 krb5_free_sam_response_2_contents(krb5_context ctx, krb5_sam_response_2 *sr2)
 {
     if (!sr2)
@@ -669,40 +585,6 @@ krb5_free_sam_response_2_contents(krb5_context ctx, krb5_sam_response_2 *sr2)
 }
 
 void KRB5_CALLCONV
-krb5_free_predicted_sam_response(krb5_context ctx,
-                                 krb5_predicted_sam_response *psr)
-{
-    if (!psr)
-        return;
-    krb5_free_predicted_sam_response_contents(ctx, psr);
-    free(psr);
-}
-
-void KRB5_CALLCONV
-krb5_free_predicted_sam_response_contents(krb5_context ctx,
-                                          krb5_predicted_sam_response *psr)
-{
-    if (!psr)
-        return;
-    if (psr->sam_key.contents)
-        krb5_free_keyblock_contents(ctx, &psr->sam_key);
-    krb5_free_principal(ctx, psr->client);
-    psr->client = 0;
-    if (psr->msd.data)
-        krb5_free_data_contents(ctx, &psr->msd);
-}
-
-void KRB5_CALLCONV
-krb5_free_enc_sam_response_enc(krb5_context ctx,
-                               krb5_enc_sam_response_enc *esre)
-{
-    if (!esre)
-        return;
-    krb5_free_enc_sam_response_enc_contents(ctx, esre);
-    free(esre);
-}
-
-void KRB5_CALLCONV
 krb5_free_enc_sam_response_enc_2(krb5_context ctx,
                                  krb5_enc_sam_response_enc_2 *esre2)
 {
@@ -713,16 +595,6 @@ krb5_free_enc_sam_response_enc_2(krb5_context ctx,
 }
 
 void KRB5_CALLCONV
-krb5_free_enc_sam_response_enc_contents(krb5_context ctx,
-                                        krb5_enc_sam_response_enc *esre)
-{
-    if (!esre)
-        return;
-    if (esre->sam_sad.data)
-        krb5_free_data_contents(ctx, &esre->sam_sad);
-}
-
-void KRB5_CALLCONV
 krb5_free_enc_sam_response_enc_2_contents(krb5_context ctx,
                                           krb5_enc_sam_response_enc_2 *esre2)
 {
@@ -777,33 +649,6 @@ krb5_free_pa_s4u_x509_user(krb5_context context, krb5_pa_s4u_x509_user *req)
 }
 
 void KRB5_CALLCONV
-krb5_free_pa_server_referral_data(krb5_context context,
-                                  krb5_pa_server_referral_data *ref)
-{
-    if (ref == NULL)
-        return;
-    krb5_free_data(context, ref->referred_realm);
-    ref->referred_realm = NULL;
-    krb5_free_principal(context, ref->true_principal_name);
-    ref->true_principal_name = NULL;
-    krb5_free_principal(context, ref->requested_principal_name);
-    ref->requested_principal_name = NULL;
-    krb5_free_checksum_contents(context, &ref->rep_cksum);
-    free(ref);
-}
-
-void KRB5_CALLCONV
-krb5_free_pa_svr_referral_data(krb5_context context,
-                               krb5_pa_svr_referral_data *ref)
-{
-    if (ref == NULL)
-        return;
-    krb5_free_principal(context, ref->principal);
-    ref->principal = NULL;
-    free(ref);
-}
-
-void KRB5_CALLCONV
 krb5_free_pa_pac_req(krb5_context context,
                      krb5_pa_pac_req *req)
 {
@@ -811,15 +656,6 @@ krb5_free_pa_pac_req(krb5_context context,
 }
 
 void KRB5_CALLCONV
-krb5_free_etype_list(krb5_context context,
-                     krb5_etype_list *etypes)
-{
-    if (etypes != NULL) {
-        free(etypes->etypes);
-        free(etypes);
-    }
-}
-void KRB5_CALLCONV
 krb5_free_fast_req(krb5_context context, krb5_fast_req *val)
 {
     if (val == NULL)
@@ -858,20 +694,6 @@ krb5_free_fast_finished(krb5_context context, krb5_fast_finished *val)
     free(val);
 }
 
-void
-krb5_free_typed_data(krb5_context context, krb5_typed_data **in)
-{
-    int i = 0;
-    if (in == NULL) return;
-    while (in[i] != NULL) {
-        if (in[i]->data != NULL)
-            free(in[i]->data);
-        free(in[i]);
-        i++;
-    }
-    free(in);
-}
-
 void KRB5_CALLCONV
 krb5_free_fast_armored_req(krb5_context context, krb5_fast_armored_req *val)
 {
@@ -885,6 +707,16 @@ krb5_free_fast_armored_req(krb5_context context, krb5_fast_armored_req *val)
     free(val);
 }
 
+void
+k5_free_data_ptr_list(krb5_data **list)
+{
+    int i;
+
+    for (i = 0; list != NULL && list[i] != NULL; i++)
+        krb5_free_data(NULL, list[i]);
+    free(list);
+}
+
 void KRB5_CALLCONV
 krb5int_free_data_list(krb5_context context, krb5_data *data)
 {
@@ -912,40 +744,173 @@ krb5_free_ad_kdcissued(krb5_context context, krb5_ad_kdcissued *val)
 }
 
 void KRB5_CALLCONV
-krb5_free_ad_signedpath(krb5_context context, krb5_ad_signedpath *val)
+krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val)
 {
-    int i;
-
     if (val == NULL)
-        return;
+        return ;
 
-    krb5_free_checksum_contents(context, &val->checksum);
-    if (val->delegated != NULL) {
-        for (i = 0; val->delegated[i] != NULL; i++)
-            krb5_free_principal(context, val->delegated[i]);
-        free(val->delegated);
-    }
-    krb5_free_pa_data(context, val->method_data);
+    krb5_free_data_contents(context, &val->target_realm);
+    krb5_free_data(context, val->cookie);
     free(val);
 }
 
 void KRB5_CALLCONV
-krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val)
+krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val)
 {
     if (val == NULL)
         return ;
 
-    krb5_free_data_contents(context, &val->target_realm);
-    krb5_free_data(context, val->cookie);
+    krb5_free_checksum_contents(context, &val->checksum);
     free(val);
 }
 
-void KRB5_CALLCONV
-krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val)
+void
+k5_free_algorithm_identifier(krb5_context context,
+                             krb5_algorithm_identifier *val)
 {
     if (val == NULL)
-        return ;
+        return;
+    free(val->algorithm.data);
+    free(val->parameters.data);
+    free(val);
+}
+
+void
+k5_free_otp_tokeninfo(krb5_context context, krb5_otp_tokeninfo *val)
+{
+    krb5_algorithm_identifier **alg;
 
+    if (val == NULL)
+        return;
+    free(val->vendor.data);
+    free(val->challenge.data);
+    free(val->token_id.data);
+    free(val->alg_id.data);
+    for (alg = val->supported_hash_alg; alg != NULL && *alg != NULL; alg++)
+        k5_free_algorithm_identifier(context, *alg);
+    free(val->supported_hash_alg);
+    free(val);
+}
+
+void
+k5_free_pa_otp_challenge(krb5_context context, krb5_pa_otp_challenge *val)
+{
+    krb5_otp_tokeninfo **ti;
+
+    if (val == NULL)
+        return;
+    free(val->nonce.data);
+    free(val->service.data);
+    for (ti = val->tokeninfo; *ti != NULL; ti++)
+        k5_free_otp_tokeninfo(context, *ti);
+    free(val->tokeninfo);
+    free(val->salt.data);
+    free(val->s2kparams.data);
+    free(val);
+}
+
+void
+k5_free_pa_otp_req(krb5_context context, krb5_pa_otp_req *val)
+{
+    if (val == NULL)
+        return;
+    val->flags = 0;
+    free(val->nonce.data);
+    free(val->enc_data.ciphertext.data);
+    if (val->hash_alg != NULL)
+        k5_free_algorithm_identifier(context, val->hash_alg);
+    free(val->otp_value.data);
+    free(val->pin.data);
+    free(val->challenge.data);
+    free(val->counter.data);
+    free(val->token_id.data);
+    free(val->alg_id.data);
+    free(val->vendor.data);
+    free(val);
+}
+
+void
+k5_free_kkdcp_message(krb5_context context, krb5_kkdcp_message *val)
+{
+    if (val == NULL)
+        return;
+    free(val->target_domain.data);
+    free(val->kerb_message.data);
+    free(val);
+}
+
+static void
+free_vmac(krb5_context context, krb5_verifier_mac *val)
+{
+    if (val == NULL)
+        return;
+    krb5_free_principal(context, val->princ);
     krb5_free_checksum_contents(context, &val->checksum);
     free(val);
 }
+
+void
+k5_free_cammac(krb5_context context, krb5_cammac *val)
+{
+    krb5_verifier_mac **vp;
+
+    if (val == NULL)
+        return;
+    krb5_free_authdata(context, val->elements);
+    free_vmac(context, val->kdc_verifier);
+    free_vmac(context, val->svc_verifier);
+    for (vp = val->other_verifiers; vp != NULL && *vp != NULL; vp++)
+        free_vmac(context, *vp);
+    free(val->other_verifiers);
+    free(val);
+}
+
+void
+k5_free_secure_cookie(krb5_context context, krb5_secure_cookie *val)
+{
+    if (val == NULL)
+        return;
+    k5_zapfree_pa_data(val->data);
+    free(val);
+}
+
+void
+k5_free_spake_factor(krb5_context context, krb5_spake_factor *val)
+{
+    if (val == NULL)
+        return;
+    if (val->data != NULL)
+        zapfree(val->data->data, val->data->length);
+    free(val->data);
+    free(val);
+}
+
+void
+k5_free_pa_spake(krb5_context context, krb5_pa_spake *val)
+{
+    krb5_spake_factor **f;
+
+    if (val == NULL)
+        return;
+    switch (val->choice) {
+    case SPAKE_MSGTYPE_SUPPORT:
+        free(val->u.support.groups);
+        break;
+    case SPAKE_MSGTYPE_CHALLENGE:
+        krb5_free_data_contents(context, &val->u.challenge.pubkey);
+        for (f = val->u.challenge.factors; f != NULL && *f != NULL; f++)
+            k5_free_spake_factor(context, *f);
+        free(val->u.challenge.factors);
+        break;
+    case SPAKE_MSGTYPE_RESPONSE:
+        krb5_free_data_contents(context, &val->u.response.pubkey);
+        krb5_free_data_contents(context, &val->u.response.factor.ciphertext);
+        break;
+    case SPAKE_MSGTYPE_ENCDATA:
+        krb5_free_data_contents(context, &val->u.encdata.ciphertext);
+        break;
+    default:
+        break;
+    }
+    free(val);
+}