Fix issue for DnsResolver#query
1. Previously, getDnsNetId doesn't handle all the cases. Fix it with cosidering bypass private DNS flag. 2. Make getDnsNetId return Network instead of netId, and change name from getDnsNetId to getDnsNetwork Bug: 129530368 Test: atest DnsResolverTest DnsUtilsTest Merged-In: Ibb5080acd3c296650d56532fc7da525e9fa95e8f (cherry picked from commit 3854966dc9499e39187835606397b16367e5e27b) Change-Id: I37353642088bcc17da0cf17f78a5ed9efc9aefc3
This commit is contained in:
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package android.net;
|
package android.net;
|
||||||
|
|
||||||
import static android.net.NetworkUtils.getDnsNetId;
|
import static android.net.NetworkUtils.getDnsNetwork;
|
||||||
import static android.net.NetworkUtils.resNetworkCancel;
|
import static android.net.NetworkUtils.resNetworkCancel;
|
||||||
import static android.net.NetworkUtils.resNetworkQuery;
|
import static android.net.NetworkUtils.resNetworkQuery;
|
||||||
import static android.net.NetworkUtils.resNetworkResult;
|
import static android.net.NetworkUtils.resNetworkResult;
|
||||||
@@ -333,7 +333,7 @@ public final class DnsResolver {
|
|||||||
final Object lock = new Object();
|
final Object lock = new Object();
|
||||||
final Network queryNetwork;
|
final Network queryNetwork;
|
||||||
try {
|
try {
|
||||||
queryNetwork = (network != null) ? network : new Network(getDnsNetId());
|
queryNetwork = (network != null) ? network : getDnsNetwork();
|
||||||
} catch (ErrnoException e) {
|
} catch (ErrnoException e) {
|
||||||
executor.execute(() -> callback.onError(new DnsException(ERROR_SYSTEM, e)));
|
executor.execute(() -> callback.onError(new DnsException(ERROR_SYSTEM, e)));
|
||||||
return;
|
return;
|
||||||
@@ -433,7 +433,7 @@ public final class DnsResolver {
|
|||||||
final FileDescriptor queryfd;
|
final FileDescriptor queryfd;
|
||||||
final Network queryNetwork;
|
final Network queryNetwork;
|
||||||
try {
|
try {
|
||||||
queryNetwork = (network != null) ? network : new Network(getDnsNetId());
|
queryNetwork = (network != null) ? network : getDnsNetwork();
|
||||||
queryfd = resNetworkQuery(queryNetwork.getNetIdForResolv(), domain, CLASS_IN, nsType,
|
queryfd = resNetworkQuery(queryNetwork.getNetIdForResolv(), domain, CLASS_IN, nsType,
|
||||||
flags);
|
flags);
|
||||||
} catch (ErrnoException e) {
|
} catch (ErrnoException e) {
|
||||||
|
|||||||
@@ -158,10 +158,9 @@ public class NetworkUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* DNS resolver series jni method.
|
* DNS resolver series jni method.
|
||||||
* Attempts to get netid of network which resolver will
|
* Attempts to get network which resolver will use if no network is explicitly selected.
|
||||||
* use if no network is explicitly selected.
|
|
||||||
*/
|
*/
|
||||||
public static native int getDnsNetId() throws ErrnoException;
|
public static native Network getDnsNetwork() throws ErrnoException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the tcp repair window associated with the {@code fd}.
|
* Get the tcp repair window associated with the {@code fd}.
|
||||||
|
|||||||
@@ -304,13 +304,19 @@ static void android_net_utils_resNetworkCancel(JNIEnv *env, jobject thiz, jobjec
|
|||||||
jniSetFileDescriptorOfFD(env, javaFd, -1);
|
jniSetFileDescriptorOfFD(env, javaFd, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static jint android_net_utils_getDnsNetId(JNIEnv *env, jobject thiz) {
|
static jobject android_net_utils_getDnsNetwork(JNIEnv *env, jobject thiz) {
|
||||||
int dnsNetId = getNetworkForDns();
|
unsigned dnsNetId = 0;
|
||||||
if (dnsNetId < 0) {
|
if (int res = getNetworkForDns(&dnsNetId) < 0) {
|
||||||
throwErrnoException(env, "getDnsNetId", -dnsNetId);
|
throwErrnoException(env, "getDnsNetId", -res);
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
bool privateDnsBypass = dnsNetId & NETID_USE_LOCAL_NAMESERVERS;
|
||||||
|
|
||||||
return dnsNetId;
|
static jclass class_Network = MakeGlobalRefOrDie(
|
||||||
|
env, FindClassOrDie(env, "android/net/Network"));
|
||||||
|
static jmethodID ctor = env->GetMethodID(class_Network, "<init>", "(IZ)V");
|
||||||
|
return env->NewObject(
|
||||||
|
class_Network, ctor, dnsNetId & ~NETID_USE_LOCAL_NAMESERVERS, privateDnsBypass);
|
||||||
}
|
}
|
||||||
|
|
||||||
static jobject android_net_utils_getTcpRepairWindow(JNIEnv *env, jobject thiz, jobject javaFd) {
|
static jobject android_net_utils_getTcpRepairWindow(JNIEnv *env, jobject thiz, jobject javaFd) {
|
||||||
@@ -369,7 +375,7 @@ static const JNINativeMethod gNetworkUtilMethods[] = {
|
|||||||
{ "resNetworkQuery", "(ILjava/lang/String;III)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkQuery },
|
{ "resNetworkQuery", "(ILjava/lang/String;III)Ljava/io/FileDescriptor;", (void*) android_net_utils_resNetworkQuery },
|
||||||
{ "resNetworkResult", "(Ljava/io/FileDescriptor;)Landroid/net/DnsResolver$DnsResponse;", (void*) android_net_utils_resNetworkResult },
|
{ "resNetworkResult", "(Ljava/io/FileDescriptor;)Landroid/net/DnsResolver$DnsResponse;", (void*) android_net_utils_resNetworkResult },
|
||||||
{ "resNetworkCancel", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_resNetworkCancel },
|
{ "resNetworkCancel", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_resNetworkCancel },
|
||||||
{ "getDnsNetId", "()I", (void*) android_net_utils_getDnsNetId },
|
{ "getDnsNetwork", "()Landroid/net/Network;", (void*) android_net_utils_getDnsNetwork },
|
||||||
};
|
};
|
||||||
|
|
||||||
int register_android_net_NetworkUtils(JNIEnv* env)
|
int register_android_net_NetworkUtils(JNIEnv* env)
|
||||||
|
|||||||
Reference in New Issue
Block a user