summaryrefslogtreecommitdiff
path: root/other-licenses
diff options
context:
space:
mode:
authorPale Moon <git-repo@palemoon.org>2015-03-29 21:08:34 +0200
committerPale Moon <git-repo@palemoon.org>2015-03-29 21:08:34 +0200
commit39c7e809c9a40918eccabf1c030c2d9c22f99049 (patch)
treef52d33c090b15608da7f6ccbc9fd697fe007b041 /other-licenses
parent53d3a1ef8ee5a441027fa0a12391133e40e25252 (diff)
downloadpalemoon-gre-39c7e809c9a40918eccabf1c030c2d9c22f99049.tar.gz
Android: Attempt to fix DNS resolution when using VPNs or switching networks on Android-L
Diffstat (limited to 'other-licenses')
-rw-r--r--other-licenses/android/getaddrinfo.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/other-licenses/android/getaddrinfo.c b/other-licenses/android/getaddrinfo.c
index 7edabbc2d..448499b90 100644
--- a/other-licenses/android/getaddrinfo.c
+++ b/other-licenses/android/getaddrinfo.c
@@ -414,19 +414,46 @@ extern int
__wrap_getaddrinfo(const char *hostname, const char *servname,
const struct addrinfo *hints, struct addrinfo **res);
-int android_sdk_version;
+extern const char *
+__real_gai_strerror(int ecode);
+extern void
+__real_freeaddrinfo(struct addrinfo *ai);
+extern int
+__real_getaddrinfo(const char *hostname, const char *servname,
+ const struct addrinfo *hints, struct addrinfo **res);
#pragma GCC visibility pop
-int android_sdk_version = -1;
+static int get_android_sdk_version()
+{
+ char version_str[PROP_VALUE_MAX];
+ memset(version_str, 0, PROP_VALUE_MAX);
+ int len = __system_property_get("ro.build.version.sdk", version_str);
+ if (len < 1) {
+#ifdef MOZ_GETADDRINFO_LOG_VERBOSE
+ __android_log_print(ANDROID_LOG_INFO, "getaddrinfo",
+ "Failed to get Android SDK version\n");
+#endif
+
+ return len;
+ }
+
+ return (int)strtol(version_str, NULL, 10);
+}
static int honeycomb_or_later()
{
+ static int android_sdk_version = 0;
+ if (android_sdk_version == 0) {
+ android_sdk_version = get_android_sdk_version();
+ }
+
#ifdef MOZ_GETADDRINFO_LOG_VERBOSE
__android_log_print(ANDROID_LOG_INFO, "getaddrinfo",
"I am%s Honeycomb\n",
(android_sdk_version >= 11) ? "" : " not");
#endif
+
return android_sdk_version >= 11;
}
@@ -434,7 +461,7 @@ const char *
__wrap_gai_strerror(int ecode)
{
if (honeycomb_or_later())
- return gai_strerror(ecode);
+ return __real_gai_strerror(ecode);
if (ecode < 0 || ecode > EAI_MAX)
ecode = EAI_MAX;
return ai_errlist[ecode];
@@ -446,7 +473,7 @@ __wrap_freeaddrinfo(struct addrinfo *ai)
struct addrinfo *next;
if (honeycomb_or_later()) {
- freeaddrinfo(ai);
+ __real_freeaddrinfo(ai);
return;
}
@@ -545,7 +572,7 @@ __wrap_getaddrinfo(const char *hostname, const char *servname,
const struct explore *ex;
if (honeycomb_or_later())
- return getaddrinfo(hostname, servname, hints, res);
+ return __real_getaddrinfo(hostname, servname, hints, res);
/* hostname is allowed to be NULL */
/* servname is allowed to be NULL */