From 214e2000de8e57b8fcfa7489f53c7aaf5dc77cdd Mon Sep 17 00:00:00 2001 From: Philip Hazel Date: Thu, 1 Dec 2005 14:21:25 +0000 Subject: [PATCH] The code for finding all the local interface addresses on a FreeBSD system running IPv6 was broken. --- doc/doc-txt/ChangeLog | 14 +++++++++++++- src/src/os.c | 11 ++++++----- src/src/version.c | 4 ++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index a81309b3b..1c8725861 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,8 +1,20 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.268 2005/11/28 10:07:55 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.269 2005/12/01 14:21:25 ph10 Exp $ Change log file for Exim from version 4.21 ------------------------------------------- +Exim version 4.61 +----------------- + +PH/01 The code for finding all the local interface addresses on a FreeBSD + system running IPv6 was broken. This may well have applied to all BSD + systems, as well as to others that have similar system calls. The broken + code found IPv4 interfaces correctly, but gave incorrect values for the + IPv6 interfaces. In particular, ::1 was not found. The effect in Exim was + that it would not match correctly against @[] and not recognize the IPv6 + addresses as local. + + Exim version 4.60 ----------------- diff --git a/src/src/os.c b/src/src/os.c index 8488fac0c..ff4d94940 100644 --- a/src/src/os.c +++ b/src/src/os.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/os.c,v 1.3 2005/06/27 14:29:43 ph10 Exp $ */ +/* $Cambridge: exim/src/src/os.c,v 1.4 2005/12/01 14:21:25 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -661,8 +661,9 @@ for (cp = buf; cp < buf + ifc.V_ifc_len; cp += len) if ((ifreq.V_ifr_flags & IFF_UP) == 0) continue; /* On some operating systems we have to get the IP address of the interface - by another call. On others, it's already there, but we must reinstate the - data in ifreq, because SIOCGIFFLAGS may wreck it. */ + by another call. On others, it's already there, but we must copy the full + length because we only copied the basic length above, and anyway, + GIFFLAGS may have wrecked the data. */ #ifndef SIOCGIFCONF_GIVES_ADDR if (ioctl(vs, V_GIFADDR, (char *)&ifreq) < 0) @@ -671,8 +672,8 @@ for (cp = buf; cp < buf + ifc.V_ifc_len; cp += len) addrp = &ifreq.V_ifr_addr; #else - memcpy((char *)&ifreq, cp, sizeof(ifreq)); - memcpy(addrbuf, (char *)&(ifreq.V_ifr_addr), len - sizeof(ifreq.V_ifr_name)); + memcpy(addrbuf, cp + offsetof(struct V_ifreq, V_ifr_addr), + len - sizeof(ifreq.V_ifr_name)); addrp = (struct sockaddr *)addrbuf; #endif diff --git a/src/src/version.c b/src/src/version.c index 33bba46ab..4a07b0bc2 100644 --- a/src/src/version.c +++ b/src/src/version.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/version.c,v 1.11 2005/10/12 15:45:38 ph10 Exp $ */ +/* $Cambridge: exim/src/src/version.c,v 1.12 2005/12/01 14:21:25 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -12,7 +12,7 @@ #include "exim.h" -#define THIS_VERSION "4.60" +#define THIS_VERSION "4.61" /* The header file cnumber.h contains a single line containing the -- 2.25.1