From 5240b562e7e9de2f31ba70f71c394c5529aadf0f Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Thu, 15 May 2014 14:43:07 -0400 Subject: [PATCH] Query libnetd_client for the appropriate netId for host resolution. If libnetd_client can't be found, operate as before and use the default netId potentially overriden by a more specific netId passed in to android_get*fornet(). (cherry picked from commit 559c7842cc6862568d9b5799fc0bcf74d58b596b) Change-Id: I42ef3293172651870fb46d2de22464c4f03e8e0b --- libc/bionic/NetdClient.cpp | 2 ++ libc/bionic/NetdClientDispatch.cpp | 5 +++++ libc/dns/gethnamaddr.c | 5 +++++ libc/dns/net/getaddrinfo.c | 3 +++ libc/private/NetdClientDispatch.h | 1 + 5 files changed, 16 insertions(+) diff --git a/libc/bionic/NetdClient.cpp b/libc/bionic/NetdClient.cpp index 75e84ee66..36796a226 100644 --- a/libc/bionic/NetdClient.cpp +++ b/libc/bionic/NetdClient.cpp @@ -43,6 +43,8 @@ static void netdClientInitImpl() { netdClientInitFunction(netdClientHandle, "netdClientInitAccept", &__netdClientDispatch.accept); netdClientInitFunction(netdClientHandle, "netdClientInitConnect", &__netdClientDispatch.connect); + netdClientInitFunction(netdClientHandle, "netdClientInitNetIdForResolv", + &__netdClientDispatch.netIdForResolv); } static pthread_once_t netdClientInitOnce = PTHREAD_ONCE_INIT; diff --git a/libc/bionic/NetdClientDispatch.cpp b/libc/bionic/NetdClientDispatch.cpp index 6bd2357fa..17bbd9d67 100644 --- a/libc/bionic/NetdClientDispatch.cpp +++ b/libc/bionic/NetdClientDispatch.cpp @@ -25,9 +25,14 @@ extern "C" __socketcall int __accept(int, sockaddr*, socklen_t*); extern "C" __socketcall int __connect(int, const sockaddr*, socklen_t); +static unsigned fallBackNetIdForResolv(unsigned netId) { + return netId; +} + // This structure is modified only at startup (when libc.so is loaded) and never // afterwards, so it's okay that it's read later at runtime without a lock. __LIBC_HIDDEN__ NetdClientDispatch __netdClientDispatch __attribute__((aligned(32))) = { __accept, __connect, + fallBackNetIdForResolv, }; diff --git a/libc/dns/gethnamaddr.c b/libc/dns/gethnamaddr.c index 4da99b2fe..1afad6d4d 100644 --- a/libc/dns/gethnamaddr.c +++ b/libc/dns/gethnamaddr.c @@ -60,6 +60,7 @@ #include #include #include +#include "NetdClientDispatch.h" #include "resolv_netid.h" #include "resolv_private.h" #include "resolv_cache.h" @@ -760,6 +761,8 @@ gethostbyname_internal(const char *name, int af, res_state res, unsigned netid, proxy = android_open_proxy(); if (proxy == NULL) goto exit; + netid = __netdClientDispatch.netIdForResolv(netid); + /* This is writing to system/netd/DnsProxyListener.cpp and changes * here need to be matched there */ if (fprintf(proxy, "gethostbyname %u %s %d", @@ -796,6 +799,8 @@ android_gethostbyaddrfornet_proxy(const void *addr, const char * addrStr = inet_ntop(af, addr, buf, sizeof(buf)); if (addrStr == NULL) goto exit; + netid = __netdClientDispatch.netIdForResolv(netid); + if (fprintf(proxy, "gethostbyaddr %s %d %d %u", addrStr, len, af, netid) < 0) { goto exit; diff --git a/libc/dns/net/getaddrinfo.c b/libc/dns/net/getaddrinfo.c index 4c120d907..be692e39a 100644 --- a/libc/dns/net/getaddrinfo.c +++ b/libc/dns/net/getaddrinfo.c @@ -92,6 +92,7 @@ #include #include #include +#include "NetdClientDispatch.h" #include "resolv_cache.h" #include "resolv_netid.h" #include "resolv_private.h" @@ -449,6 +450,8 @@ android_getaddrinfo_proxy( return EAI_NODATA; } + netid = __netdClientDispatch.netIdForResolv(netid); + // Send the request. proxy = fdopen(sock, "r+"); if (fprintf(proxy, "getaddrinfo %s %s %d %d %d %d %u", diff --git a/libc/private/NetdClientDispatch.h b/libc/private/NetdClientDispatch.h index 0390bfb05..c256288bc 100644 --- a/libc/private/NetdClientDispatch.h +++ b/libc/private/NetdClientDispatch.h @@ -25,6 +25,7 @@ __BEGIN_DECLS struct NetdClientDispatch { int (*accept)(int, struct sockaddr*, socklen_t*); int (*connect)(int, const struct sockaddr*, socklen_t); + unsigned (*netIdForResolv)(unsigned); }; extern __LIBC_HIDDEN__ struct NetdClientDispatch __netdClientDispatch;