Uprating of the passphrase pixie.
[u/mdw/catacomb] / key-attr.c
index 3737a5d..27f4490 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: key-attr.c,v 1.1 1999/12/22 15:47:48 mdw Exp $
+ * $Id$
  *
  * Key attribute manipulation
  *
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: key-attr.c,v $
- * Revision 1.1  1999/12/22 15:47:48  mdw
- * Major key-management revision.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <ctype.h>
@@ -43,7 +35,7 @@
 #include <string.h>
 #include <time.h>
 
-#include <mLib/alloc.h>
+#include <mLib/dstr.h>
 #include <mLib/sym.h>
 
 #include "key.h"
@@ -61,7 +53,7 @@
 
 int key_chkident(const char *p)
 {
-  if (!p || !*p)
+  if (!p || !*p || strlen(p) > 255)
     return (-1);
   while (*p) {
     if (*p == ':' || *p == '.' || isspace((unsigned char)*p))
@@ -170,14 +162,16 @@ int key_putattr(key_file *f, key *k, const char *n, const char *v)
 
   if (!(f->f & KF_WRITE))
     return (KERR_READONLY);
+  if (strlen(n) > 255)
+    return (KERR_BADATTR);
 
   if (v) {
     a = sym_find(&k->a, n, -1, sizeof(*a), &found);
     if (found)
-      free(a->p);
+      xfree(a->p);
     a->p = xstrdup(v);
   } else if ((a = sym_find(&k->a, n, -1, 0, 0)) != 0) {
-    free(a->p);
+    xfree(a->p);
     sym_remove(&k->a, a);
   }
 
@@ -203,7 +197,7 @@ int key_setcomment(key_file *f, key *k, const char *c)
   if (key_chkcomment(c))
     return (KERR_BADCOMMENT);
   if (k->c)
-    free(k->c);
+    xfree(k->c);
   if (c)
     k->c = xstrdup(c);
   else
@@ -246,7 +240,7 @@ int key_settag(key_file *f, key *k, const char *tag)
 
   if (tag) {
     kr = sym_find(&f->bytag, tag, -1, sizeof(*kr), &found);
-    if (found)
+    if (found && !KEY_EXPIRED(time(0), kr->k->del))
       return (KERR_DUPTAG);
     kr->k = k;
   }
@@ -257,7 +251,7 @@ int key_settag(key_file *f, key *k, const char *tag)
     kr = sym_find(&f->bytag, k->tag, -1, 0, 0);
     assert(((void)"No bytag link", kr));
     sym_remove(&f->bytag, kr);
-    free(k->tag);
+    xfree(k->tag);
   }
 
   /* --- Done --- */