The code for finding all the local interface addresses on a FreeBSD
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 1 Dec 2005 14:21:25 +0000 (14:21 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 1 Dec 2005 14:21:25 +0000 (14:21 +0000)
system running IPv6 was broken.

doc/doc-txt/ChangeLog
src/src/os.c
src/src/version.c

index a81309b3bf081531b5cf21c6abd01fc4c1e95877..1c87258619a5d3cc8833cca6e1888f60c6f41038 100644 (file)
@@ -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
 -----------------
 
index 8488fac0c910b9a52e50de06cab7ee095f4710a9..ff4d94940ef84b39811ad2ace5f0905c9cf17a3b 100644 (file)
@@ -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
 
index 33bba46ab56ea9e3840f135a5898d365cd0053db..4a07b0bc2dfe18adf4f1605a31820ebf5418d9a6 100644 (file)
@@ -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