[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