Yahoo Groups archive

Milter-greylist

Index last updated: 2026-04-28 23:32 UTC

Message

Re: [milter-greylist] milter-greylist 2.1.8 is available

2006-07-28 by Hajimu UMEMOTO

Hi,

>>>>> On Fri, 28 Jul 2006 07:18:33 +0200
>>>>> manu@... said:

manu> Checked in. Thank you for the input.
manu> I'll wait a bit before releasing 2.1.9, so that we don't have a release
manu> every 8 hour :-)

Thank you.
I made one more patch.  Since sa_len is referred, I think it is not
buildable on Linux.  And, some cleanups.
I've not test it actually, yet.

Index: acl.c
diff -u -p acl.c.orig acl.c
--- acl.c.orig	Fri Jul 28 05:08:32 2006
+++ acl.c	Fri Jul 28 16:00:18 2006
@@ -615,7 +615,7 @@ acl_filter(sa, salen, hostname, from, rc
 		}
 
 		if (acl->a_dnsrbl != NULL) {
-			if (dnsrbl_check_source(sa, acl->a_dnsrbl) != 0) {
+			if (dnsrbl_check_source(sa, salen, acl->a_dnsrbl) != 0) {
 				retval |= EXF_DNSRBL;
 				if (conf.c_debug) {
 					iptostring(sa, salen, 
Index: dnsrbl.c
diff -u -p dnsrbl.c.orig dnsrbl.c
--- dnsrbl.c.orig	Fri Jul 28 13:18:56 2006
+++ dnsrbl.c	Fri Jul 28 16:30:26 2006
@@ -73,6 +73,7 @@ __RCSID("$Id: dnsrbl.c,v 1.3 2006/07/26 
 #endif
 
 #include "milter-greylist.h"
+#include "pending.h"
 #include "dnsrbl.h"
 
 /* 
@@ -88,8 +89,9 @@ dnsrbl_init(void) {
 }
 
 int
-dnsrbl_check_source(sa, source)
+dnsrbl_check_source(sa, salen, source)
 	struct sockaddr *sa;
+	socklen_t salen;
         struct dnsrbl_entry *source;
 {
 #ifdef HAVE_RESN
@@ -99,7 +101,6 @@ dnsrbl_check_source(sa, source)
 	char req[NS_MAXDNAME + 1];
 	char ans[NS_MAXMSG + 1];
 	int anslen;
-	void *addr;
 	ns_msg handle;
 	ns_rr rr;
 	int i;
@@ -107,29 +108,14 @@ dnsrbl_check_source(sa, source)
 	struct sockaddr *blacklisted;
 	int retval = 0;
 
-	blacklisted = (struct sockaddr *)&source->d_blacklisted;
+	blacklisted = SA(&source->d_blacklisted);
 
 	res_ninit(&res);
 
-	reverse_endian((struct sockaddr *)&ss, sa);
+	reverse_endian(SA(&ss), sa, salen);
 
-	switch (ss.ss_family) {
-	case AF_INET:
-		addr = &((struct sockaddr_in *)&ss)->sin_addr;
-		break;
-#ifdef AF_INET6
-	case AF_INET6:
-		addr = &((struct sockaddr_in6 *)&ss)->sin6_addr;
-		break;
-#endif
-	default:
-		syslog(LOG_ERR, "unexpected address family %d", ss.ss_family);
-		exit(EX_SOFTWARE);
-		break;
-	}
-
-	if ((inet_ntop(ss.ss_family, addr, req, NS_MAXDNAME)) == NULL){
-		syslog(LOG_ERR, "inet_ntop failed: %s", strerror(errno));
+	if ((iptostring(SA(&ss), salen, req, NS_MAXDNAME)) == NULL) {
+		syslog(LOG_ERR, "iptostring failed: %s", strerror(errno));
 		retval = -1;
 		goto end;
 	}
@@ -204,25 +190,24 @@ end:
 
 /* XXX this code is probably broken with IPv6 */
 void
-reverse_endian(dst, src)
+reverse_endian(dst, src, len)
 	struct sockaddr *src;
 	struct sockaddr *dst;
+	socklen_t len;
 {
-	int i, len;
+	int i;
 	char *src_start;
 	char *dst_start;
 
 	switch (src->sa_family) {
 	case AF_INET:
-		src_start = (char *)&((struct sockaddr_in *)src)->sin_addr;
-		dst_start = (char *)&((struct sockaddr_in *)dst)->sin_addr;
-		len = sizeof(((struct sockaddr_in *)src)->sin_addr);
+		src_start = (char *)SADDR4(src);
+		dst_start = (char *)SADDR4(dst);
 		break;
 #ifdef AF_INET6
 	case AF_INET6:
-		src_start = (char *)&((struct sockaddr_in6 *)src)->sin6_addr;
-		dst_start = (char *)&((struct sockaddr_in6 *)dst)->sin6_addr;
-		len = sizeof(((struct sockaddr_in6 *)src)->sin6_addr);
+		src_start = (char *)SADDR6(src);
+		dst_start = (char *)SADDR6(dst);
 		break;
 #endif
 	default:
@@ -232,7 +217,9 @@ reverse_endian(dst, src)
 	}
 
 	dst->sa_family = src->sa_family;
+#ifdef HAVE_SA_LEN
 	dst->sa_len = src->sa_len;
+#endif
 
 	for (i = 0; i < len; i++)
 		dst_start[len - 1 - i] = src_start[i];
@@ -247,17 +234,34 @@ dnsrbl_source_add(name, domain, blacklis
 	struct sockaddr *blacklisted;
 {
 	struct dnsrbl_entry *de;
+	socklen_t len;
 
 	if ((de = malloc(sizeof(*de))) == NULL) {
 		syslog(LOG_ERR, "malloc failed: %s", strerror(errno));
 		exit(EX_OSERR);
 	}
 
+	switch (blacklisted->sa_family) {
+	case AF_INET:
+		len = sizeof(*SADDR4(blacklisted));
+		break;
+#ifdef AF_INET6
+	case AF_INET6:
+		len = sizeof(*SADDR6(blacklisted));
+		break;
+#endif
+	default:
+		syslog(LOG_ERR, "invalid address family %d",
+		    blacklisted->sa_family);
+		exit(EX_SOFTWARE);
+		break;
+	}
+
 	strncpy(de->d_name, name, sizeof(de->d_name));
 	de->d_name[sizeof(de->d_name) - 1] = '\0';
 	strncpy(de->d_domain, domain, sizeof(de->d_domain));
 	de->d_domain[sizeof(de->d_domain) - 1] = '\0';
-	memcpy(&de->d_blacklisted, blacklisted, blacklisted->sa_len);
+	memcpy(&de->d_blacklisted, blacklisted, len);
 
 	LIST_INSERT_HEAD(&dnsrbl_head, de, d_list);
 
Index: dnsrbl.h
diff -u dnsrbl.h.orig dnsrbl.h
--- dnsrbl.h.orig	Thu Jul 27 21:48:24 2006
+++ dnsrbl.h	Fri Jul 28 16:12:53 2006
@@ -45,8 +45,8 @@
 };
 
 void dnsrbl_init(void);
-int dnsrbl_check_source(struct sockaddr *, struct dnsrbl_entry *);
-void reverse_endian(struct sockaddr *, struct sockaddr *);
+int dnsrbl_check_source(struct sockaddr *, socklen_t, struct dnsrbl_entry *);
+void reverse_endian(struct sockaddr *, struct sockaddr *, socklen_t);
 void dnsrbl_source_add(char *, char *, struct sockaddr *);
 struct dnsrbl_entry *dnsrbl_byname(char *);
 void dnsrbl_clear(void);

Sincerely,

--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume@...  ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.