postfix/libinet6 vs ppp
Jakub Bogusz
qboosh w prioris.mini.pw.edu.pl
Wto, 20 Lis 2001, 23:00:28 CET
Chyba znalazłem przyczynę konfliktu:
W łacie do postfiksa jest taki fragment:
#v+
+ if (getifaddrs(&ifap) < 0)
+ msg_fatal("%s: getifaddrs: %m", myname);
+
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+ if (! (ifa->ifa_flags & IFF_RUNNING))
+ continue;
+ sa = ifa->ifa_addr;
+ switch (ifa->ifa_addr->sa_family) {
#v-
Tymczasem wywołanie getifaddrs podczas połączenia ppp (modem) daje coś
takiego (brak v6 w jajku):
#v+
Breakpoint 1, main () at g.c:7
7 getifaddrs(&ifap);
(gdb) n
8 }
(gdb) p ifap
$1 = (struct ifaddrs *) 0x808afd0
(gdb) p *ifap
$2 = {ifa_next = 0x808afec, ifa_name = 0x808b274 "lo", ifa_flags = 73, ifa_addr = 0x808b078,
ifa_netmask = 0x0, ifa_ifu = {ifu_broadaddr = 0x808b08c, ifu_dstaddr = 0x808b08c},
ifa_data = 0x808b160}
(gdb) p *ifap->ifa_next
$3 = {ifa_next = 0x808b008, ifa_name = 0x808b278 "eth0", ifa_flags = 4163, ifa_addr = 0x808b0b4,
ifa_netmask = 0x0, ifa_ifu = {ifu_broadaddr = 0x808b0c8, ifu_dstaddr = 0x808b0c8},
ifa_data = 0x808b1bc}
(gdb) p *ifap->ifa_next->ifa_next
$4 = {ifa_next = 0x808b024, ifa_name = 0x808b280 "ppp0", ifa_flags = 4305, ifa_addr = 0x0,
ifa_netmask = 0x0, ifa_ifu = {ifu_broadaddr = 0x0, ifu_dstaddr = 0x0}, ifa_data = 0x808b218}
(gdb) p *ifap->ifa_next->ifa_next.ifa_data
Attempt to dereference a generic pointer.
(gdb) p *ifap->ifa_next->ifa_next->ifa_data
Attempt to dereference a generic pointer.
(gdb) p *ifap->ifa_next->ifa_next->ifa_addr
Cannot access memory at address 0x0
(gdb) p *ifap->ifa_next->ifa_addr
$5 = {sa_family = 17, sa_data = "\000\000\002\000\000\000\001\000\000\006\000@\005á"}
(gdb) p/x ifap->ifa_next->ifa_next->ifa_flags
$6 = 0x10d1
#v-
Jak widać: trzeci interfejs to ppp0. ifa_flags & IFF_RUNNING (==0x40)
jest niezerowe - czyli idzie dalej. A dalej jest odwołanie do pamięci
pod wskaźnikiem ifa->ifa_addr - który w przypadku interfejsu ppp0 jest
NULLem! Czy powinien być? Nie wiem.
Jeszcze sprawdziłem co jest dalej na liście - te same interfejsy
z adresami AF_INET (na początku były z AF_PACKET, oprócz ppp0, który był
z NULLem):
#v+
(gdb) p *ifap->ifa_next->ifa_next->ifa_next
$7 = {ifa_next = 0x808b040, ifa_name = 0x808b288 "lo", ifa_flags = 73, ifa_addr = 0x808b0f0,
ifa_netmask = 0x808b100, ifa_ifu = {ifu_broadaddr = 0x0, ifu_dstaddr = 0x0}, ifa_data = 0x0}
(gdb) p *ifap->ifa_next->ifa_next->ifa_next->ifa_next
$8 = {ifa_next = 0x808b05c, ifa_name = 0x808b29c "eth0", ifa_flags = 4163, ifa_addr = 0x808b110,
ifa_netmask = 0x808b130, ifa_ifu = {ifu_broadaddr = 0x808b120, ifu_dstaddr = 0x808b120},
ifa_data = 0x0}
(gdb) p *ifap->ifa_next->ifa_next->ifa_next->ifa_next->ifa_next
$9 = {ifa_next = 0x0, ifa_name = 0x808b2b0 "ppp0", ifa_flags = 4305, ifa_addr = 0x808b140,
ifa_netmask = 0x808b150, ifa_ifu = {ifu_broadaddr = 0x0, ifu_dstaddr = 0x0}, ifa_data = 0x0}
(gdb) p *ifap->ifa_next->ifa_next->ifa_next->ifa_next->ifa_next->ifa_addr
$10 = {sa_family = 2, sa_data = "\000\000\001\001\001\001\000\000\000\000\000\000\000"}
(gdb) p *ifap->ifa_next->ifa_next->ifa_next->ifa_next->ifa_addr
$11 = {sa_family = 2, sa_data = "\000\000Ŕ¨\000\003\000\000\000\000\000\000\000"}
(gdb) p *ifap->ifa_next->ifa_next->ifa_next->ifa_addr
$12 = {sa_family = 2, sa_data = "\000\000\177\000\000\001\000\000\000\000\000\000\000"}
(gdb) p *ifap->ifa_next->ifa_next->ifa_next->ifa_next->ifa_next
$13 = {ifa_next = 0x0, ifa_name = 0x808b2b0 "ppp0", ifa_flags = 4305, ifa_addr = 0x808b140,
ifa_netmask = 0x808b150, ifa_ifu = {ifu_broadaddr = 0x0, ifu_dstaddr = 0x0}, ifa_data = 0x0}
(gdb) p *ifap->ifa_addr
$14 = {sa_family = 17, sa_data = "\000\000\001\000\000\000\004\003\000\006\000\000\000"}
#v-
postfix bierze pod uwagę tylko interfejsy AF_INET i AF_INET6 - czyli
przed switchem "if(ifa->ifa_addr==NULL) continue;" powinno załatwić
sprawę?
Czy ktoś z ppp (np. SDI) mógłby przetestować postiksa+v6 z tą poprawką?
W dystrybucji poprawię to może jutro lub pojutrze, wraz z RBL - ale
potrzebuję testerów do obu poprawek...
--
Jakub Bogusz
http://prioris.mini.pw.edu.pl/~qboosh/
Więcej informacji o liście dyskusyjnej pld-devel-pl