Properly handle msDS-AdditionalDnsHostName returned from Windows DC
authorIsaac Boukris <iboukris@gmail.com>
Thu, 11 Jun 2020 13:51:27 +0000 (16:51 +0300)
committerIsaac Boukris <iboukris@sn-devel-184>
Thu, 18 Jun 2020 16:43:47 +0000 (16:43 +0000)
Windows DC adds short names for each specified msDS-AdditionalDnsHostName
attribute, but these have a suffix of "\0$" and thus fail with
ldap_get_values(), use ldap_get_values_len() instead.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14406

Signed-off-by: Isaac Boukris <iboukris@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Autobuild-User(master): Isaac Boukris <iboukris@samba.org>
Autobuild-Date(master): Thu Jun 18 16:43:47 UTC 2020 on sn-devel-184

selftest/knownfail.d/binary_addl_hostname [deleted file]
source3/libads/ldap.c

diff --git a/selftest/knownfail.d/binary_addl_hostname b/selftest/knownfail.d/binary_addl_hostname
deleted file mode 100644 (file)
index 559db1d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-^samba4.blackbox.net_ads.dns alias1 check keytab
-^samba4.blackbox.net_ads.dns alias2 check keytab
-^samba4.blackbox.net_ads.addl short check keytab
index d443e3ee20ccc1f02a7d93d14e446c7ea069d75c..51ceb44725422101a3bee0d56dca0c41abab7fa0 100755 (executable)
@@ -3685,6 +3685,40 @@ out:
 /********************************************************************
 ********************************************************************/
 
+static char **get_addl_hosts(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx,
+                             LDAPMessage *msg, size_t *num_values)
+{
+       const char *field = "msDS-AdditionalDnsHostName";
+       struct berval **values = NULL;
+       char **ret = NULL;
+       size_t i, converted_size;
+
+       values = ldap_get_values_len(ads->ldap.ld, msg, field);
+       if (values == NULL) {
+               return NULL;
+       }
+
+       *num_values = ldap_count_values_len(values);
+
+       ret = talloc_array(mem_ctx, char *, *num_values + 1);
+       if (ret == NULL) {
+               ldap_value_free_len(values);
+               return NULL;
+       }
+
+       for (i = 0; i < *num_values; i++) {
+               if (!pull_utf8_talloc(mem_ctx, &ret[i], values[i]->bv_val,
+                                     &converted_size)) {
+                       ldap_value_free_len(values);
+                       return NULL;
+               }
+       }
+       ret[i] = NULL;
+
+       ldap_value_free_len(values);
+       return ret;
+}
+
 ADS_STATUS ads_get_additional_dns_hostnames(TALLOC_CTX *mem_ctx,
                                            ADS_STRUCT *ads,
                                            const char *machine_name,
@@ -3710,9 +3744,7 @@ ADS_STATUS ads_get_additional_dns_hostnames(TALLOC_CTX *mem_ctx,
                goto done;
        }
 
-       *hostnames_array = ads_pull_strings(ads, mem_ctx, res,
-                                           "msDS-AdditionalDnsHostName",
-                                           num_hostnames);
+       *hostnames_array = get_addl_hosts(ads, mem_ctx, res, num_hostnames);
        if (*hostnames_array == NULL) {
                DEBUG(1, ("Host account for %s does not have msDS-AdditionalDnsHostName.\n",
                          machine_name));