The patched submitted by Andrei fixed it for me.
There are some style issues, I fixed the ones I saw and reattached the
patch.

Index: ikeca.c
===================================================================
RCS file: /cvs/src/usr.sbin/ikectl/ikeca.c,v
retrieving revision 1.46
diff -u -p -r1.46 ikeca.c
--- ikeca.c     8 Jun 2017 11:45:44 -0000       1.46
+++ ikeca.c     25 Oct 2017 12:51:59 -0000
@@ -85,11 +85,11 @@ struct {
 };
 
 /* explicitly list allowed variables */
-const char *ca_env[][2] = {
+char *ca_env[][2] = {
        { "$ENV::CADB", NULL },
        { "$ENV::CASERIAL", NULL },
-       { "$ENV::CERTFQDN", NULL },
-       { "$ENV::CERTIP", NULL },
+       { "DNS:$ENV::CERTFQDN", NULL },
+       { "IP:$ENV::CERTIP", NULL },
        { "$ENV::CERTPATHLEN", NULL },
        { "$ENV::CERTUSAGE", NULL },
        { "$ENV::CERT_C", NULL },
@@ -202,23 +202,26 @@ ca_request(struct ca *ca, char *keyname,
 {
        char            cmd[PATH_MAX * 2];
        char            hostname[HOST_NAME_MAX+1];
-       char            name[128];
+       char            subjaltname[HOST_NAME_MAX+5];
        char            path[PATH_MAX];
 
        ca_setenv("$ENV::CERT_CN", keyname);
 
-       strlcpy(name, keyname, sizeof(name));
-
        if (type == HOST_IPADDR) {
-               ca_setenv("$ENV::CERTIP", name);
+               snprintf(subjaltname, sizeof(subjaltname), "IP:%s", keyname);
+               ca_setenv("IP:$ENV::CERTIP", subjaltname);
                ca_setenv("$ENV::REQ_EXT", "x509v3_IPAddr");
        } else if (type == HOST_FQDN) {
                if (!strcmp(keyname, "local")) {
                        if (gethostname(hostname, sizeof(hostname)))
                                err(1, "gethostname");
-                       strlcpy(name, hostname, sizeof(name));
+                       snprintf(subjaltname, sizeof(subjaltname), "DNS:%s",
+                           hostname);
+               } else {
+                       snprintf(subjaltname, sizeof(subjaltname), "DNS:%s",
+                           keyname);
                }
-               ca_setenv("$ENV::CERTFQDN", name);
+               ca_setenv("DNS:$ENV::CERTFQDN", subjaltname);
                ca_setenv("$ENV::REQ_EXT", "x509v3_FQDN");
        } else {
                errx(1, "unknown host type %d", type);
@@ -306,6 +309,9 @@ ca_certificate(struct ca *ca, char *keyn
        ca_request(ca, keyname, type);
        ca_sign(ca, keyname, type);
 
+       /* call ca_clrenv again to free the char*'s allocated by ca_setenv */
+       ca_clrenv();
+
        return (0);
 }
 
@@ -440,6 +446,9 @@ ca_create(struct ca *ca)
        /* Create the CRL revocation list */
        ca_revoke(ca, NULL);
 
+       /* call ca_clrenv again to free the char*'s allocated by ca_setenv */
+       ca_clrenv();
+
        return (0);
 }
 
@@ -892,6 +901,11 @@ ca_revoke(struct ca *ca, char *keyname)
            ca->passfile, ca->sslpath, ca->sslpath);
        system(cmd);
 
+       if (keyname) {
+               /* ca_revoke() called directly from ca_opt() so free char *'s */
+               ca_clrenv();
+       }
+
        return (0);
 }
 
@@ -899,20 +913,26 @@ void
 ca_clrenv(void)
 {
        int      i;
-       for (i = 0; ca_env[i][0] != NULL; i++)
+       for (i = 0; ca_env[i][0] != NULL; i++) {
+               free((char *) ca_env[i][1]);
                ca_env[i][1] = NULL;
+       }
 }
 
 void
 ca_setenv(const char *key, const char *value)
 {
        int      i;
+       char    *p = NULL;
 
        for (i = 0; ca_env[i][0] != NULL; i++) {
                if (strcmp(ca_env[i][0], key) == 0) {
                        if (ca_env[i][1] != NULL)
                                errx(1, "env %s already set: %s", key, value);
-                       ca_env[i][1] = value;
+                       p = strdup(value);
+                       if (p == NULL)
+                               err(1, NULL);
+                       ca_env[i][1] = p;
                        return;
                }
        }



--
Sent from: 
http://openbsd-archive.7691.n7.nabble.com/openbsd-dev-bugs-f183916.html

Reply via email to