changeset 134:f9917ce924a3

all dns lookups fully qualified, my_read() bug fix
author carl
date Wed, 02 Aug 2006 21:06:05 -0700
parents b8ce1b31237d
children 8e813497582e
files ChangeLog NEWS configure.in src/dnsbl.cpp
diffstat 4 files changed, 24 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Tue Aug 01 15:28:13 2006 -0700
+++ b/ChangeLog	Wed Aug 02 21:06:05 2006 -0700
@@ -1,5 +1,10 @@
     $Id$
 
+5.20 2006-08-02
+    Fully qualify all dns lookups.  Fix my_read() bug.  Try to convert
+    names that might be ip addresses via inet_aton before doing dns
+    lookups.
+
 5.19 2006-08-01
     Bug fix - add trailing dot to uribl dns lookups to make them fully
     qualified.  Check host names with only two components, since
--- a/NEWS	Tue Aug 01 15:28:13 2006 -0700
+++ b/NEWS	Wed Aug 02 21:06:05 2006 -0700
@@ -1,5 +1,6 @@
     $Id$
 
+5.20 2006-08-02 fully qualify all dns lookups; fix my_read() bug
 5.19 2006-08-01 uribl dnsl lookups fully qualified; allow two component host names; rpm properly creates user
 5.18 2006-04-27 sendmail no longer guarantees <> wrapper on envelopes, don't ask uribls about rfc1918 space either
 5.17 2006-03-25 never ask dns blacklists about rfc1918 address space
--- a/configure.in	Tue Aug 01 15:28:13 2006 -0700
+++ b/configure.in	Wed Aug 02 21:06:05 2006 -0700
@@ -1,7 +1,7 @@
 AC_INIT(configure.in)
 
 AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(dnsbl,5.19)
+AM_INIT_AUTOMAKE(dnsbl,5.20)
 AC_PATH_PROGS(BASH, bash)
 
 AC_LANG_CPLUSPLUS
--- a/src/dnsbl.cpp	Tue Aug 01 15:28:13 2006 -0700
+++ b/src/dnsbl.cpp	Wed Aug 02 21:06:05 2006 -0700
@@ -346,7 +346,7 @@
 int mlfiPriv::my_read(char *buf, int len) {
 	if (err) return 0;
 	int rs = 0;
-	while (len > 1) {
+	while (len) {
 		int ws = read(fd, buf, len);
 		if (ws > 0) {
 			rs	+= ws;
@@ -504,7 +504,21 @@
 	// milter thread is talking over its own socket to a separate resolver
 	// process, which does the actual dns resolution.
 	if (priv.err) return 0; // cannot ask more questions on this socket.
-	priv.my_write(question, strlen(question)+1);   // write the question including the null terminator
+	if (maybe_ip) {
+		// might be a bare ip address, try this first to avoid dns lookups that may not be needed
+		in_addr ip;
+		if (inet_aton(question, &ip)) {
+			return (int)ip.s_addr;
+		}
+	}
+	int n = strlen(question);
+	if (question[n-1] == '.') {
+		priv.my_write(question, n+1);	// write the question including the null terminator
+	}
+	else {
+		priv.my_write(question, n); 	// write the question
+		priv.my_write(".", 2);          // and the fully qualified . terminator and null string terminator
+	}
 	glommer glom;
 	char *buf = (char *)&glom;
 	priv.my_read(buf, sizeof(glom.length));
@@ -586,13 +600,6 @@
 				}
 			}
 		}
-		if (maybe_ip && !ret_address) {
-			// might be a bare ip address
-			in_addr ip;
-			if (inet_aton(question, &ip)) {
-				ret_address = ip.s_addr;
-			}
-		}
 	pthread_mutex_unlock(&resolve_mutex);
 	return ret_address;
 #else
@@ -658,7 +665,7 @@
 
 
 ////////////////////////////////////////////////
-//	lookup the domain name part of a hostname on two lists
+//	lookup the domain name part of a hostname on the uribl
 //
 //	if we find part of the hostname on the uribl, return
 //	true and point found to the part of the hostname that we found.