From 0f421d7111d3e6beff72d2fb2ce82d4a7c74889c Mon Sep 17 00:00:00 2001 From: mdw Date: Thu, 11 Nov 2004 12:47:26 +0000 Subject: [PATCH] More rational initialization and finalization. --- key-data.c | 51 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/key-data.c b/key-data.c index 7cbc6fd..8bb9099 100644 --- a/key-data.c +++ b/key-data.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: key-data.c,v 1.6 2004/04/08 01:36:15 mdw Exp $ + * $Id$ * * Encoding and decoding of key data * @@ -58,7 +58,8 @@ void key_binary(key_data *k, const void *p, size_t sz) { - k->e = (k->e & ~KF_ENCMASK) | KENC_BINARY; + key_destroy(k); + k->e |= KENC_BINARY; k->u.k.k = sub_alloc(sz); memcpy(k->u.k.k, p, sz); k->u.k.sz = sz; @@ -77,7 +78,8 @@ void key_binary(key_data *k, const void *p, size_t sz) void key_encrypted(key_data *k, const void *p, size_t sz) { - k->e = (k->e & ~KF_ENCMASK) | KENC_ENCRYPT; + key_destroy(k); + k->e |= KENC_ENCRYPT; k->u.k.k = sub_alloc(sz); memcpy(k->u.k.k, p, sz); k->u.k.sz = sz; @@ -95,7 +97,8 @@ void key_encrypted(key_data *k, const void *p, size_t sz) void key_mp(key_data *k, mp *m) { - k->e = (k->e & ~KF_ENCMASK) | KENC_MP; + key_destroy(k); + k->e |= KENC_MP; k->u.m = MP_COPY(m); } @@ -111,7 +114,8 @@ void key_mp(key_data *k, mp *m) void key_string(key_data *k, const char *p) { - k->e = (k->e & ~KF_ENCMASK) | KENC_STRING; + key_destroy(k); + k->e |= KENC_STRING; k->u.p = xstrdup(p); } @@ -126,8 +130,9 @@ void key_string(key_data *k, const char *p) */ void key_ec(key_data *k, const ec *e) -{ - k->e = (k->e & ~KF_ENCMASK) | KENC_EC; +{ + key_destroy(k); + k->e |= KENC_EC; EC_CREATE(&k->u.e); EC_COPY(&k->u.e, e); } @@ -143,7 +148,8 @@ void key_ec(key_data *k, const ec *e) void key_structure(key_data *k) { - k->e = KENC_STRUCT; + key_destroy(k); + k->e |= KENC_STRUCT; sym_create(&k->u.s); } @@ -187,7 +193,9 @@ key_data *key_structcreate(key_data *k, const char *tag) ks = sym_find(&k->u.s, tag, -1, sizeof(*ks), &f); if (f) key_destroy(&ks->k); - ks->k.e = KF_TEMP; + ks->k.e = 0; + ks->k.u.k.k = 0; + ks->k.u.k.sz = 0; return (&ks->k); } @@ -207,9 +215,11 @@ void key_destroy(key_data *k) switch (k->e & KF_ENCMASK) { case KENC_BINARY: case KENC_ENCRYPT: - if (k->e & KF_BURN) - memset(k->u.k.k, 0, k->u.k.sz); - sub_free(k->u.k.k, k->u.k.sz); + if (k->u.k.k) { + if (k->e & KF_BURN) + memset(k->u.k.k, 0, k->u.k.sz); + sub_free(k->u.k.k, k->u.k.sz); + } break; case KENC_MP: mp_drop(k->u.m); @@ -224,13 +234,14 @@ void key_destroy(key_data *k) sym_iter i; key_struct *ks; - for (sym_mkiter(&i, &k->u.s); (ks = sym_next(&i)) != 0; ) { - if (!(ks->k.e & KF_TEMP)) - key_destroy(&ks->k); - } + for (sym_mkiter(&i, &k->u.s); (ks = sym_next(&i)) != 0; ) + key_destroy(&ks->k); sym_destroy(&k->u.s); } break; } + k->e = (k->e & ~KF_ENCMASK); + k->u.k.k = 0; + k->u.k.sz = 0; } /* --- @key_do@ --- * @@ -297,8 +308,12 @@ int key_copy(key_data *kd, key_data *k, const key_filter *kf) case KENC_BINARY: case KENC_ENCRYPT: - kd->u.k.k = sub_alloc(k->u.k.sz); - memcpy(kd->u.k.k, k->u.k.k, k->u.k.sz); + if (!k->u.k.k) + kd->u.k.k = 0; + else { + kd->u.k.k = sub_alloc(k->u.k.sz); + memcpy(kd->u.k.k, k->u.k.k, k->u.k.sz); + } kd->u.k.sz = k->u.k.sz; break; -- 2.11.0