aboutsummaryrefslogtreecommitdiffstats
path: root/libc/netbsd/net/getaddrinfo.c
diff options
context:
space:
mode:
authorSelim Gurun <sgurun@google.com>2012-02-27 15:58:54 -0800
committerSelim Gurun <sgurun@google.com>2012-03-07 15:09:05 -0800
commit06e1831f194389b6f56ac016ebb52ed5cd430bb2 (patch)
tree1bae36f75baac7fd29c053323e6f17af609ec573 /libc/netbsd/net/getaddrinfo.c
parent83c366cf093b068da38e24e4ae4525c015ddde20 (diff)
downloadandroid_bionic-06e1831f194389b6f56ac016ebb52ed5cd430bb2.tar.gz
android_bionic-06e1831f194389b6f56ac016ebb52ed5cd430bb2.tar.bz2
android_bionic-06e1831f194389b6f56ac016ebb52ed5cd430bb2.zip
Prevent potential stall on dns proxy operations.
Update wire protocol to return and process error code first. This will make sure dns proxy operations do not stall when an internal error happens. Also fix a compiler warning. Also fix a potential buffer overflow. And use correct types (uint32_t) rather than int when reading from network. Change-Id: I9f99c16d6fd5e9137491a4d1b293a7c78e31b9c3
Diffstat (limited to 'libc/netbsd/net/getaddrinfo.c')
-rw-r--r--libc/netbsd/net/getaddrinfo.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/libc/netbsd/net/getaddrinfo.c b/libc/netbsd/net/getaddrinfo.c
index 6ae6e3e43..7dd65ff3a 100644
--- a/libc/netbsd/net/getaddrinfo.c
+++ b/libc/netbsd/net/getaddrinfo.c
@@ -130,6 +130,9 @@ static const char in6_loopback[] = {
};
#endif
+// This should be synchronized to ResponseCode.h
+static const int DnsProxyQueryResult = 222;
+
static const struct afd {
int a_af;
int a_addrlen;
@@ -476,12 +479,15 @@ android_getaddrinfo_proxy(
goto exit;
}
- int remote_rv;
- if (fread(&remote_rv, sizeof(int), 1, proxy) != 1) {
+ char buf[5];
+ // read result code for gethostbyaddr
+ if (fread(buf, 1, sizeof(buf), proxy) != sizeof(buf)) {
goto exit;
}
- if (remote_rv != 0) {
+ int result_code = (int)strtol(buf, NULL, 10);
+ // verify the code itself
+ if (result_code != DnsProxyQueryResult ) {
goto exit;
}