reassign 740509 glibc found 740509 glibc/2.19-11 affects 740509 + freebsd-net-tools tags 740509 + patch thanks Hi, On 21/10/14 03:00, Steven Chamberlain wrote: > The attached patch uses rt_msghdr->ifm_msglen to guess the > running kernel version and accordingly, find the right place for the > struct sockaddr_dl. I expect it will still work for the i386-on-amd64 > compat case also. It works! It passed glibc's testsuite when running on kfreebsd-i386 9.0 (like on the buildds), and has fixed ifconfig on kfreebsd-i386 10.1. I've also committed it to /svn/glibc-bsd/trunk/glibc-ports Please could we get this into the next glibc upload, in order to fix kfreebsd-i386 networking? It might be an idea to also bump the Build-Depends to kfreebsd-kernel-headers (>> 10.1~) [kfreebsd-any] because otherwise, building against older k-k-h could produce a glibc that still has this bug when run on a 10.1 (sid/jessie) kernel. Thanks! Regards, -- Steven Chamberlain steven@pyro.eu.org
From: Steven Chamberlain <steven@pyro.eu.org>
Subject: getifaddrs: work around a kfreebsd 9.0 to 10.1 ABI break
--- a/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/ifaddrs.c 2014-10-21 01:19:18.000000000 +0000
+++ b/ports/sysdeps/unix/bsd/bsd4.4/kfreebsd/ifaddrs.c 2014-10-21 01:27:59.072736100 +0000
@@ -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;
Attachment:
signature.asc
Description: OpenPGP digital signature