Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Jan 2018 02:33:12 +0300
From:      Yuri Pankov <yuripv@icloud.com>
To:        Li-Wen Hsu <lwhsu@freebsd.org>, freebsd-hackers@freebsd.org
Subject:   Re: Calling getaddrinfo(3) in 32-bit binary on 64-bit host
Message-ID:  <8c6dc5b5-7640-61fc-b687-08efd1e621ee@icloud.com>
In-Reply-To: <CAKBkRUx14r%2B%2BZ-n64SNDd4uu=hoJv-KaXxeyUGM7f%2BDS2Ha%2BmQ@mail.gmail.com>
References:  <CAKBkRUx14r%2B%2BZ-n64SNDd4uu=hoJv-KaXxeyUGM7f%2BDS2Ha%2BmQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Jan 22, 2018 at 05:14:59AM +0800, Li-Wen Hsu wrote:
> Hi all,
> 
> Recently I found a strange case: calling getaddrinfo(3) cannot resolve IPv6
> address in 32-bit binary on 64-bit host.
> It happens on vanilla installed 11.1-R and also on r327788 snapshot build.
> 
> For a program like this:
> https://gist.github.com/lwhsu/1288aa5be90b9e7da934a3e2bfc55aa3
> 
> It works fine when compiled as a 32-bit binary and run on a 32-bit host.
> As expected, It is also works fine when compiled as a 64-bit binary and run
> on a 64-bit host
> 
> However, when taking the 32-bit binary and run on a 64 bit system (with
> /usr/lib32 installed),
> getaddrinfo(3) just returns: "Non-recoverable failure in name resolution"

Apparently, it goes through addrconfig() down to getifaddrs() returning 
bogus data for IPv6 addresses.  This most likely has to with SALIGN 
being incorrect for 32-bit binary trying to parse route messages from 
64-bit kernel.  I'm not sure about proper fix here, but changing SALIGN 
to be 7 (that is, "sizeof(long) - 1" on amd64 platform) makes your test 
case return correct data.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8c6dc5b5-7640-61fc-b687-08efd1e621ee>