[PATCH 04/31] rwrap: Handle trailing dot in dns names.
Andreas Schneider
asn at samba.org
Wed Dec 3 07:45:00 MST 2014
Signed-off-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Guenther Deschner <gd at samba.org>
---
lib/resolv_wrapper/resolv_wrapper.c | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/lib/resolv_wrapper/resolv_wrapper.c b/lib/resolv_wrapper/resolv_wrapper.c
index 07ec85c..3b94a36 100644
--- a/lib/resolv_wrapper/resolv_wrapper.c
+++ b/lib/resolv_wrapper/resolv_wrapper.c
@@ -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;
}
--
2.1.3
More information about the samba-technical
mailing list