Make the Q dnsresolver tests pass on 2020-01 or later modules. am: 3f47223fe9 am: 3eafc6a87b
Change-Id: I384d512892163c3010b3b3ea2a8b737f5971462d
diff --git a/apex/manifest.json b/apex/manifest.json
index 6739a4d..f3f5b02 100644
--- a/apex/manifest.json
+++ b/apex/manifest.json
@@ -1,4 +1,4 @@
{
"name": "com.android.resolv",
- "version": 290000000
+ "version": 299900000
}
diff --git a/bpf_progs/netd.c b/bpf_progs/netd.c
index 8f2863e..1362be2 100644
--- a/bpf_progs/netd.c
+++ b/bpf_progs/netd.c
@@ -16,6 +16,7 @@
#include "netd.h"
#include <linux/bpf.h>
+#include <linux/if_packet.h>
SEC("cgroupskb/ingress/stats")
int bpf_cgroup_ingress(struct __sk_buff* skb) {
@@ -45,8 +46,18 @@
int xt_bpf_whitelist_prog(struct __sk_buff* skb) {
uint32_t sock_uid = bpf_get_socket_uid(skb);
if (is_system_uid(sock_uid)) return BPF_MATCH;
+
+ // 65534 is the overflow 'nobody' uid, usually this being returned means
+ // that skb->sk is NULL during RX (early decap socket lookup failure),
+ // which commonly happens for incoming packets to an unconnected udp socket.
+ // Additionally bpf_get_socket_cookie() returns 0 if skb->sk is NULL
+ if ((sock_uid == 65534) && !bpf_get_socket_cookie(skb) &&
+ (skb->pkt_type == PACKET_HOST || skb->pkt_type == PACKET_BROADCAST ||
+ skb->pkt_type == PACKET_MULTICAST))
+ return BPF_MATCH;
+
UidOwnerValue* whitelistMatch = bpf_uid_owner_map_lookup_elem(&sock_uid);
- if (whitelistMatch) return whitelistMatch->rule & HAPPY_BOX_MATCH;
+ if (whitelistMatch) return whitelistMatch->rule & HAPPY_BOX_MATCH ? BPF_MATCH : BPF_NOMATCH;
return BPF_NOMATCH;
}
@@ -54,7 +65,7 @@
int xt_bpf_blacklist_prog(struct __sk_buff* skb) {
uint32_t sock_uid = bpf_get_socket_uid(skb);
UidOwnerValue* blacklistMatch = bpf_uid_owner_map_lookup_elem(&sock_uid);
- if (blacklistMatch) return blacklistMatch->rule & PENALTY_BOX_MATCH;
+ if (blacklistMatch) return blacklistMatch->rule & PENALTY_BOX_MATCH ? BPF_MATCH : BPF_NOMATCH;
return BPF_NOMATCH;
}
diff --git a/server/ResolvStub.cpp b/server/ResolvStub.cpp
index d84572f..5928790 100644
--- a/server/ResolvStub.cpp
+++ b/server/ResolvStub.cpp
@@ -64,7 +64,7 @@
ALOGI("Loaded resolver library from %s", path.c_str());
break;
}
- ALOGW("dlopen(%s) failed: %s", path.c_str(), strerror(errno));
+ ALOGW("dlopen(%s) failed: %s", path.c_str(), dlerror());
}
if (netdResolvHandle == nullptr) {