]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Use krb5_expand_hostname() when creating KDB
authorGreg Hudson <ghudson@mit.edu>
Tue, 17 Nov 2015 18:33:21 +0000 (13:33 -0500)
committerGreg Hudson <ghudson@mit.edu>
Wed, 24 Aug 2016 16:31:21 +0000 (12:31 -0400)
In kdb5_util's add_admin_princs(), use krb5_expand_hostname() instead
of custom canonicalization code to canonicalize the hostname.  There
are some minor behavior differences:

* Canonicalization will no longer use AI_ADDRCONFIG.
* Canonicalization will use reverse DNS if configuration permits.
* Canonicalization will be affected by the dns_canonicalize_hostname
  and rdns profile variables.
* If name lookup fails, the original hostname will be used.
* A trailing dot will be removed from the name lookup result, if
  present.

ticket: 8278

src/kadmin/dbutil/kadm5_create.c

index 121305006359984c04926b052b105aad0ef6a179..1745a4d62039ad62b6e21ce77e0022e6f8aaede2 100644 (file)
@@ -145,59 +145,29 @@ int kadm5_create_magic_princs(kadm5_config_params *params,
 static int add_admin_princs(void *handle, krb5_context context, char *realm)
 {
     krb5_error_code ret = 0;
-    char *service_name = 0, *kiprop_name = 0, *p;
+    char *service_name = 0, *kiprop_name = 0, *canonhost = 0;
     char localname[MAXHOSTNAMELEN];
-    struct addrinfo *ai, ai_hints;
-    int gai_error;
 
     if (gethostname(localname, MAXHOSTNAMELEN)) {
         ret = errno;
         perror("gethostname");
         goto clean_and_exit;
     }
-    memset(&ai_hints, 0, sizeof(ai_hints));
-    ai_hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
-    gai_error = getaddrinfo(localname, (char *)NULL, &ai_hints, &ai);
-    if (gai_error) {
-        ret = EINVAL;
-        fprintf(stderr, "getaddrinfo(%s): %s\n", localname,
-                gai_strerror(gai_error));
-        goto clean_and_exit;
-    }
-    if (ai->ai_canonname == NULL) {
-        ret = EINVAL;
-        fprintf(stderr, _("getaddrinfo(%s): Cannot determine canonical "
-                          "hostname.\n"), localname);
-        freeaddrinfo(ai);
+    ret = krb5_expand_hostname(context, localname, &canonhost);
+    if (ret) {
+        com_err(progname, ret, _("while canonicalizing local hostname"));
         goto clean_and_exit;
     }
-    for (p = ai->ai_canonname; *p; p++) {
-#ifdef isascii
-        if (!isascii(*p))
-            continue;
-#else
-        if (*p < ' ')
-            continue;
-        if (*p > '~')
-            continue;
-#endif
-        if (!isupper(*p))
-            continue;
-        *p = tolower(*p);
-    }
-    if (asprintf(&service_name, "kadmin/%s", ai->ai_canonname) < 0) {
+    if (asprintf(&service_name, "kadmin/%s", canonhost) < 0) {
         ret = ENOMEM;
         fprintf(stderr, _("Out of memory\n"));
-        freeaddrinfo(ai);
         goto clean_and_exit;
     }
-    if (asprintf(&kiprop_name, "kiprop/%s", ai->ai_canonname) < 0) {
+    if (asprintf(&kiprop_name, "kiprop/%s", canonhost) < 0) {
         ret = ENOMEM;
         fprintf(stderr, _("Out of memory\n"));
-        freeaddrinfo(ai);
         goto clean_and_exit;
     }
-    freeaddrinfo(ai);
 
     if ((ret = add_admin_princ(handle, context,
                                service_name, realm,
@@ -224,6 +194,7 @@ static int add_admin_princs(void *handle, krb5_context context, char *realm)
     ret = add_admin_princ(handle, context, kiprop_name, realm, 0, 0);
 
 clean_and_exit:
+    krb5_free_string(context, canonhost);
     free(service_name);
     free(kiprop_name);