Package: eglibc Version: 2.13-38+deb7u7 When setting a Postfix server for outgoing mail using a very simple configuration, I had issues resolving MX entries on the postfix logs like :
Feb 3 20:11:06 londo postfix/smtp[4288]: 3CB504BE8: to=<f...@bar.com>, relay=none, delay=0.06, delays=0.04/0.01/0/0, dsn=4.4.3, status=deferred (Host or domain name not found. Name service error for name=bar.com type=MX: Host not found, try again). This resolving issue was random (About one of the two tests) The configuration in /etc/resolv.conf was the following : nameserver <IPV6 resolver> nameserver <IPV4 resolver> nameserver <IPV4 resolver> options timeout:1 attempts:3 rotate The three resolvers are OK : I queried them independently and they answer perfectly so it's not a resolver issue. After lots of investigations, I isolated the following behaviour : There is no resolving issue when removing the rotate option OR when putting the IPV6 resolver after the IPV4 ones. Browsing on the Web, a chat partner (Thanks Stephane) found this bug on Redhat/Fedora distributions : https://bugzilla.redhat.com/show_bug.cgi?id=841787 which seems to be similar to my bug. A patch has been applied to the Fedora / RH distributions. This patch is described here: http://pkgs.fedoraproject.org/cgit/glibc.git/tree/glibc-rh841787.patch?h=f17. I updated the patch for the eglibc since a part of the patch was already into the debian patches series (any/submitted-resolv-init.diff) and recompiled a package. After installation, it seems that the issue was solved : The DNS resolution was 100 % OK. I send the patch as attachement. (I'm not a low level C developper so i hope this patch is not too ugly) Thanks ! Regards, Olivier Bonhomme
diff -rup a/resolv/res_init.c b/resolv/res_init.c --- a/resolv/res_init.c 2012-07-26 15:10:45.655638776 -0600 +++ b/resolv/res_init.c 2012-07-26 15:11:27.731423002 -0600 @@ -314,9 +314,9 @@ __res_vinit(res_state statp, int preinit cp++; if ((*cp != '\0') && (*cp != '\n') && __inet_aton(cp, &a)) { - statp->nsaddr_list[nservall].sin_addr = a; - statp->nsaddr_list[nservall].sin_family = AF_INET; - statp->nsaddr_list[nservall].sin_port = + statp->nsaddr_list[nserv].sin_addr = a; + statp->nsaddr_list[nserv].sin_family = AF_INET; + statp->nsaddr_list[nserv].sin_port = htons(NAMESERVER_PORT); nserv++; #ifdef _LIBC diff -rup a/resolv/res_send.c b/resolv/res_send.c --- a/resolv/res_send.c 2010-05-04 05:27:23.000000000 -0600 +++ b/resolv/res_send.c 2012-07-26 15:34:58.398261659 -0600 @@ -421,10 +421,10 @@ __libc_res_nsend(res_state statp, const EXT(statp).nsmap[n] = MAXNS; } } - n = statp->nscount; - if (statp->nscount > EXT(statp).nscount) + n = statp->nscount - EXT(statp).nscount6; + if (n > EXT(statp).nscount) for (n = EXT(statp).nscount, ns = 0; - n < statp->nscount; n++) { + n < statp->nscount - EXT(statp).nscount6; n++) { while (ns < MAXNS && EXT(statp).nsmap[ns] != MAXNS) ns++;