s4-dnsserver: Always encode user-supplied names when looking up DNS records
authorAndrew Bartlett <abartlet@samba.org>
Mon, 28 Aug 2017 23:48:46 +0000 (11:48 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 20 Sep 2017 06:15:21 +0000 (08:15 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12994

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
source4/rpc_server/dnsserver/dcerpc_dnsserver.c
source4/rpc_server/dnsserver/dnsdb.c

index 286da18346b694c4de674bb7e5858c6f365d8a26..120d4b9a3d72a35b07d636a78a6347c82fb0b5ba 100644 (file)
@@ -1674,10 +1674,13 @@ static WERROR dnsserver_enumerate_root_records(struct dnsserver_state *dsstate,
        /* Add any additional records */
        if (select_flag & DNS_RPC_VIEW_ADDITIONAL_DATA) {
                for (i=0; i<add_count; i++) {
+                       char *encoded_name
+                               = ldb_binary_encode_string(tmp_ctx,
+                                                          add_names[i]);
                        ret = ldb_search(dsstate->samdb, tmp_ctx, &res, z->zone_dn,
                                         LDB_SCOPE_ONELEVEL, attrs,
                                         "(&(objectClass=dnsNode)(name=%s)(!(dNSTombstoned=TRUE)))",
-                                       add_names[i]);
+                                        encoded_name);
                        if (ret != LDB_SUCCESS || res->count == 0) {
                                talloc_free(res);
                                continue;
@@ -1744,10 +1747,12 @@ static WERROR dnsserver_enumerate_records(struct dnsserver_state *dsstate,
                                 LDB_SCOPE_ONELEVEL, attrs,
                                 "(&(objectClass=dnsNode)(!(dNSTombstoned=TRUE)))");
        } else {
+               char *encoded_name
+                       = ldb_binary_encode_string(tmp_ctx, name);
                ret = ldb_search(dsstate->samdb, tmp_ctx, &res, z->zone_dn,
                                 LDB_SCOPE_ONELEVEL, attrs,
                                 "(&(objectClass=dnsNode)(|(name=%s)(name=*.%s))(!(dNSTombstoned=TRUE)))",
-                               name, name);
+                                encoded_name, encoded_name);
        }
        if (ret != LDB_SUCCESS) {
                talloc_free(tmp_ctx);
@@ -1818,11 +1823,15 @@ static WERROR dnsserver_enumerate_records(struct dnsserver_state *dsstate,
 
                        /* Search all the available zones for additional name */
                        for (z2 = dsstate->zones; z2; z2 = z2->next) {
+                               char *encoded_name;
                                name = dns_split_node_name(tmp_ctx, add_names[i], z2->name);
+                               encoded_name
+                                       = ldb_binary_encode_string(tmp_ctx,
+                                                                  name);
                                ret = ldb_search(dsstate->samdb, tmp_ctx, &res, z2->zone_dn,
                                                LDB_SCOPE_ONELEVEL, attrs,
                                                "(&(objectClass=dnsNode)(name=%s)(!(dNSTombstoned=TRUE)))",
-                                               name);
+                                               encoded_name);
                                talloc_free(name);
                                if (ret != LDB_SUCCESS) {
                                        continue;
index da37878ce2c0e00b97c22b03c213ba4ef8ee785c..15fe5657d3ac33af6ef9438ebc90cdf2c29765e6 100644 (file)
@@ -364,10 +364,12 @@ WERROR dnsserver_db_add_empty_node(TALLOC_CTX *mem_ctx,
        const char * const attrs[] = { "name", NULL };
        struct ldb_result *res;
        struct ldb_dn *dn;
+       char *encoded_name = ldb_binary_encode_string(mem_ctx, name);
        int ret;
 
        ret = ldb_search(samdb, mem_ctx, &res, z->zone_dn, LDB_SCOPE_BASE, attrs,
-                       "(&(objectClass=dnsNode)(name=%s))", name);
+                       "(&(objectClass=dnsNode)(name=%s))",
+                        encoded_name);
        if (ret != LDB_SUCCESS) {
                return WERR_INTERNAL_DB_ERROR;
        }
@@ -406,6 +408,7 @@ WERROR dnsserver_db_add_record(TALLOC_CTX *mem_ctx,
        int serial;
        WERROR werr;
        bool was_tombstoned = false;
+       char *encoded_name = ldb_binary_encode_string(mem_ctx, name);
 
        werr = dns_to_dnsp_convert(mem_ctx, add_record, &rec, true);
        if (!W_ERROR_IS_OK(werr)) {
@@ -436,7 +439,8 @@ WERROR dnsserver_db_add_record(TALLOC_CTX *mem_ctx,
        rec->dwTimeStamp = t;
 
        ret = ldb_search(samdb, mem_ctx, &res, z->zone_dn, LDB_SCOPE_ONELEVEL, attrs,
-                       "(&(objectClass=dnsNode)(name=%s))", name);
+                       "(&(objectClass=dnsNode)(name=%s))",
+                        encoded_name);
        if (ret != LDB_SUCCESS) {
                return WERR_INTERNAL_DB_ERROR;
        }
@@ -524,6 +528,7 @@ WERROR dnsserver_db_update_record(TALLOC_CTX *mem_ctx,
        int ret, i;
        int serial;
        WERROR werr;
+       char *encoded_name = ldb_binary_encode_string(mem_ctx, name);
 
        werr = dns_to_dnsp_convert(mem_ctx, add_record, &arec, true);
        if (!W_ERROR_IS_OK(werr)) {
@@ -541,7 +546,8 @@ WERROR dnsserver_db_update_record(TALLOC_CTX *mem_ctx,
        arec->dwTimeStamp = t;
 
        ret = ldb_search(samdb, mem_ctx, &res, z->zone_dn, LDB_SCOPE_ONELEVEL, attrs,
-                       "(&(objectClass=dnsNode)(name=%s)(!(dNSTombstoned=TRUE)))", name);
+                       "(&(objectClass=dnsNode)(name=%s)(!(dNSTombstoned=TRUE)))",
+                        encoded_name);
        if (ret != LDB_SUCCESS) {
                return WERR_INTERNAL_DB_ERROR;
        }
@@ -642,7 +648,8 @@ WERROR dnsserver_db_delete_record(TALLOC_CTX *mem_ctx,
        }
 
        ret = ldb_search(samdb, mem_ctx, &res, z->zone_dn, LDB_SCOPE_ONELEVEL, attrs,
-                       "(&(objectClass=dnsNode)(name=%s))", name);
+                       "(&(objectClass=dnsNode)(name=%s))",
+                        ldb_binary_encode_string(mem_ctx, name));
        if (ret != LDB_SUCCESS) {
                return WERR_INTERNAL_DB_ERROR;
        }