[Glibc-bsd-commits] r5651 - trunk/glibc-ports/kfreebsd

stevenc-guest at alioth.debian.org stevenc-guest at alioth.debian.org
Tue Oct 21 11:50:03 UTC 2014


Author: stevenc-guest
Date: 2014-10-21 11:50:03 +0000 (Tue, 21 Oct 2014)
New Revision: 5651

Modified:
   trunk/glibc-ports/kfreebsd/ifaddrs.c
Log:
getifaddrs: work around a kfreebsd 9.0 to 10.1 ABI break (Closes: #740509)

Use rt_msghdr->ifm_msglen to guess the running kernel version and
accordingly, find the right place for the struct sockadr_dl.

Affected only kfreebsd-i386;  also works for kfreebsd-i386-on-amd64
compat situation.


Modified: trunk/glibc-ports/kfreebsd/ifaddrs.c
===================================================================
--- trunk/glibc-ports/kfreebsd/ifaddrs.c	2014-10-20 18:57:47 UTC (rev 5650)
+++ trunk/glibc-ports/kfreebsd/ifaddrs.c	2014-10-21 11:50:03 UTC (rev 5651)
@@ -147,7 +147,13 @@
 			if (ifm->ifm_addrs & RTA_IFP) {
 				idx = ifm->ifm_index;
 				++icnt;
+				/* XXX: smooth over a kfreebsd 9.0->10.1 ABI break:
+				  sizeof(struct rt_msghdr) is correct for 10.1 kernel */
 				dl = (struct sockaddr_dl *)(void *)(ifm + 1);
+				if (rtm->rtm_msglen == 152) {
+					/* on kfreebsd-i386 9.0, struct rt_msghdr is 96 bytes */
+					dl = (struct sockaddr_dl *)((char *)ifm + 96);
+				}
 				dcnt += SA_RLEN((struct sockaddr *)(void*)dl) +
 				    ALIGNBYTES;
 #ifdef	HAVE_IFM_DATA
@@ -234,7 +240,13 @@
 			ifm = (struct if_msghdr *)(void *)rtm;
 			if (ifm->ifm_addrs & RTA_IFP) {
 				idx = ifm->ifm_index;
+				/* XXX: smooth over a kfreebsd 9.0->10.1 ABI break:
+				  sizeof(struct rt_msghdr) is correct for 10.1 kernel */
 				dl = (struct sockaddr_dl *)(void *)(ifm + 1);
+				if (rtm->rtm_msglen == 152) {
+					/* on kfreebsd-i386 9.0, struct rt_msghdr is 96 bytes */
+					dl = (struct sockaddr_dl *)((char *)ifm + 96);
+				}
 
 				cif = ift;
 				ift->ifa_name = names;




More information about the Glibc-bsd-commits mailing list