diff options
author | Pale Moon <git-repo@palemoon.org> | 2015-03-29 21:08:34 +0200 |
---|---|---|
committer | Pale Moon <git-repo@palemoon.org> | 2015-03-29 21:08:34 +0200 |
commit | 39c7e809c9a40918eccabf1c030c2d9c22f99049 (patch) | |
tree | f52d33c090b15608da7f6ccbc9fd697fe007b041 /other-licenses | |
parent | 53d3a1ef8ee5a441027fa0a12391133e40e25252 (diff) | |
download | palemoon-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.c | 37 |
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 */ |