rwrap: Handle trailing dot in dns names.
authorAndreas Schneider <asn@samba.org>
Wed, 3 Dec 2014 14:45:00 +0000 (15:45 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 5 Dec 2014 22:32:06 +0000 (23:32 +0100)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
lib/resolv_wrapper/resolv_wrapper.c

index 07ec85ca99db3a929df9ce2f6fed98f11349ebcf..3b94a36bfe468691e37ad237550fbc5446608036 100644 (file)
@@ -558,6 +558,8 @@ static int rwrap_res_fake_hosts(const char *hostfile,
        int rc = ENOENT;
        char *key = NULL;
        char *value = NULL;
+       char *query_name = NULL;
+       size_t qlen = strlen(query);
 
        RWRAP_LOG(RWRAP_LOG_TRACE,
                  "Searching in fake hosts file %s\n", hostfile);
@@ -570,6 +572,15 @@ static int rwrap_res_fake_hosts(const char *hostfile,
                return -1;
        }
 
+       if (qlen > 0 && query[qlen-1] == '.') {
+               qlen--;
+       }
+
+       query_name = strndup(query, qlen);
+       if (query_name == NULL) {
+               return -1;
+       }
+
        while (fgets(buf, sizeof(buf), fp) != NULL) {
                char *rec_type;
                char *q;
@@ -593,23 +604,23 @@ static int rwrap_res_fake_hosts(const char *hostfile,
                        continue;
                }
 
-               if (TYPE_MATCH(type, ns_t_a, rec_type, "A", key, query)) {
+               if (TYPE_MATCH(type, ns_t_a, rec_type, "A", key, query_name)) {
                        rc = rwrap_fake_a(key, value, answer, anslen);
                        break;
                } else if (TYPE_MATCH(type, ns_t_aaaa,
-                                     rec_type, "AAAA", key, query)) {
+                                     rec_type, "AAAA", key, query_name)) {
                        rc = rwrap_fake_aaaa(key, value, answer, anslen);
                        break;
                } else if (TYPE_MATCH(type, ns_t_srv,
-                                     rec_type, "SRV", key, query)) {
+                                     rec_type, "SRV", key, query_name)) {
                        rc = rwrap_fake_srv(key, value, answer, anslen);
                        break;
                } else if (TYPE_MATCH(type, ns_t_soa,
-                                     rec_type, "SOA", key, query)) {
+                                     rec_type, "SOA", key, query_name)) {
                        rc = rwrap_fake_soa(key, value, answer, anslen);
                        break;
                } else if (TYPE_MATCH(type, ns_t_cname,
-                                     rec_type, "CNAME", key, query)) {
+                                     rec_type, "CNAME", key, query_name)) {
                        rc = rwrap_fake_cname(key, value, answer, anslen);
                        break;
                }
@@ -618,19 +629,20 @@ static int rwrap_res_fake_hosts(const char *hostfile,
        switch (rc) {
        case 0:
                RWRAP_LOG(RWRAP_LOG_TRACE,
-                               "Successfully faked answer for [%s]\n", query);
+                               "Successfully faked answer for [%s]\n", query_name);
                break;
        case -1:
                RWRAP_LOG(RWRAP_LOG_ERROR,
-                               "Error faking answer for [%s]\n", query);
+                               "Error faking answer for [%s]\n", query_name);
                break;
        case ENOENT:
                RWRAP_LOG(RWRAP_LOG_TRACE,
-                               "Record for [%s] not found\n", query);
+                               "Record for [%s] not found\n", query_name);
                rc = rwrap_fake_empty_query(key, type, answer, anslen);
                break;
        }
 
+       free(query_name);
        fclose(fp);
        return rc;
 }