The commit summary is too generic. How about: rpc: getaddrinfo: also accept IPv4-mapped IPv6 addresses On a Monday in 2020, Zhimin Feng wrote:
If only IPv6 is configured and nscd is started, getaddrinfo
Is ncsd required to reproduce this? Looking at glibc source: libvirt passes AI_ADDRCONFIG and if getifaddrs returs only one family, it is placed into req->ai_family and the code below is hit.
function reture value is -9. So hints.ai_flags should include the AI_V4MAPPED flag. The following is the partial implementation of getaddrinfo(glibc): if (req->ai_family == AF_UNSPEC || req->ai_family == AF_INET) at->family = AF_INET; else if (req->ai_family == AF_INET6 && (req->ai_flags & AI_V4MAPPED)) { at->addr[3] = at->addr[0]; at->addr[2] = htonl (0xffff); at->addr[1] = 0; at->addr[0] = 0; at->family = AF_INET6; } else { result = -EAI_ADDRFAMILY; goto free_and_return; }
However small, I'd rather not include GPL code in our commit messages. Proposed commit message: If only IPv6 is configured on the host, getaddrinfo with AI_ADDRCONFIG in hints would return EAI_ADDRFAMILY for nodenames that resolve to IPv4. Also pass AI_V4MAPPED to accept IPv4-mapped addresses on IPv6-only systems.
Signed-off-by: Zhimin Feng <fengzhimin1@xxxxxxxxxx> --- src/rpc/virnetsocket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c index a217404fa6..c547acefc0 100644 --- a/src/rpc/virnetsocket.c +++ b/src/rpc/virnetsocket.c @@ -575,7 +575,7 @@ int virNetSocketNewConnectTCP(const char *nodename, memset(&hints, 0, sizeof(hints)); hints.ai_family = family; - hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; + hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG | AI_V4MAPPED; hints.ai_socktype = SOCK_STREAM; int e = getaddrinfo(nodename, service, &hints, &ai);
Reviewed-by: Ján Tomko <jtomko@xxxxxxxxxx> Jano
Attachment:
signature.asc
Description: PGP signature