server/keymgmt.c: Capture copies of the keyring and tag strings.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 16 Jun 2018 12:16:11 +0000 (13:16 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 25 Jan 2019 12:10:32 +0000 (12:10 +0000)
Slightly complicated because the private-key tag can legitimately be
null to indicate that the old-fashioned search by key-exchange group
thing should be done.

server/keymgmt.c
server/tripe.h

index a72164e..48e4de6 100644 (file)
@@ -145,7 +145,7 @@ typedef struct keyhalf {
   const char *kind;
   int (*load)(key_file *, key *, key_data *,
              const dhops *, kdata *, dstr *, dstr *);
-  const char *kr;
+  char *kr;
   key_file *kf;
   fwatch w;
   sym_table tab;
@@ -300,7 +300,7 @@ static int kh_reopen(keyhalf *kh)
 
 static void kh_init(keyhalf *kh, const char *kr)
 {
-  kh->kr = kr;
+  kh->kr = xstrdup(kr);
   fwatch_init(&kh->w, kr);
   sym_create(&kh->tab);
   if (kh_reopen(kh)) exit(EXIT_FAILURE);
@@ -547,12 +547,13 @@ static void kh_clear(keyhalf *kh)
     if (kn->kd) km_unref(kn->kd);
   sym_destroy(&kh->tab);
   key_close(kh->kf);
+  xfree(kh->kr);
   kh->kf = 0;
 }
 
 /*----- Main code ---------------------------------------------------------*/
 
-const char *tag_priv;
+char *tag_priv = 0;
 kdata *master;
 
 /* --- @km_init@ --- *
@@ -583,7 +584,7 @@ void km_init(const char *privkr, const char *pubkr, const char *ptag)
   kh_init(&priv, privkr);
   kh_init(&pub, pubkr);
 
-  tag_priv = ptag;
+  tag_priv = ptag ? xstrdup(ptag) : 0;
   if ((master = km_findpriv(ptag)) == 0) exit(EXIT_FAILURE);
 }
 
@@ -632,6 +633,7 @@ void km_clear(void)
   kh_clear(&priv);
   kh_clear(&pub);
   if (master) { km_unref(master); master = 0; }
+  if (tag_priv) { xfree(tag_priv); tag_priv = 0; }
 }
 
 /* --- @km_findpub@, @km_findpriv@ --- *
index b062b36..bf75b45 100644 (file)
@@ -819,7 +819,7 @@ extern const tunnel_ops *tunnels[]; /* Table of tunnels (0-term) */
 extern const tunnel_ops *tun_default;  /* Default tunnel to use */
 extern udpsocket udpsock[NADDRFAM];    /* The master UDP sockets */
 extern kdata *master;                  /* Default private key */
-extern const char *tag_priv;           /* Default private key tag */
+extern char *tag_priv;                 /* Default private key tag */
 
 #ifndef NTRACE
 extern const trace_opt tr_opts[];      /* Trace options array */