More rational initialization and finalization.
authormdw <mdw>
Thu, 11 Nov 2004 12:47:26 +0000 (12:47 +0000)
committermdw <mdw>
Thu, 11 Nov 2004 12:47:26 +0000 (12:47 +0000)
key-data.c

index 7cbc6fd..8bb9099 100644 (file)
@@ -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;