diff --git a/tests/cts/net/native/qtaguid/src/NativeQtaguidTest.cpp b/tests/cts/net/native/qtaguid/src/NativeQtaguidTest.cpp
index 926a740..9009c24 100644
--- a/tests/cts/net/native/qtaguid/src/NativeQtaguidTest.cpp
+++ b/tests/cts/net/native/qtaguid/src/NativeQtaguidTest.cpp
@@ -23,7 +23,7 @@
 #include <gtest/gtest.h>
 #include <cutils/qtaguid.h>
 
-int getCtrlRefCnt(int tag, uid_t uid) {
+int getCtrlSkInfo(int tag, uid_t uid, uint64_t* sk_addr, int* ref_cnt) {
     FILE *fp;
     fp = fopen("/proc/net/xt_qtaguid/ctrl", "r");
     if (!fp)
@@ -38,43 +38,66 @@
         if (strstr(line_buffer, pattern) == NULL)
             continue;
         int res;
-        uint32_t ref_cnt;
         pid_t dummy_pid;
-        uint64_t dummy_sk;
         uint64_t k_tag;
         uint32_t k_uid;
         const int TOTAL_PARAM = 5;
         res = sscanf(line_buffer, "sock=%" PRIx64 " tag=0x%" PRIx64 " (uid=%" PRIu32 ") "
-                     "pid=%u f_count=%u", &dummy_sk, &k_tag, &k_uid,
-                     &dummy_pid, &ref_cnt);
+                     "pid=%u f_count=%u", sk_addr, &k_tag, &k_uid,
+                     &dummy_pid, ref_cnt);
         if (!(res == TOTAL_PARAM && k_tag == full_tag && k_uid == uid))
-            res = -EINVAL;
-        res = ref_cnt;
+            return -EINVAL;
         free(line_buffer);
-        return res;
+        return 0;
     }
     free(line_buffer);
     return -ENOENT;
 }
 
-TEST (NativeSocketRefCnt, close_socket_without_untag) {
+void checkNoSocketPointerLeaks(int family) {
+    int sockfd = socket(family, SOCK_STREAM, 0);
+    uid_t uid = getuid();
+    int tag = arc4random();
+    int ref_cnt;
+    uint64_t sk_addr;
+    uint64_t expect_addr = 0;
+
+    EXPECT_EQ(0, qtaguid_tagSocket(sockfd, tag, uid));
+    EXPECT_EQ(0, getCtrlSkInfo(tag, uid, &sk_addr, &ref_cnt));
+    EXPECT_EQ(expect_addr, sk_addr);
+    close(sockfd);
+    EXPECT_EQ(-ENOENT, getCtrlSkInfo(tag, uid, &sk_addr, &ref_cnt));
+}
+
+TEST (NativeQtaguidTest, close_socket_without_untag) {
     int sockfd = socket(AF_INET, SOCK_STREAM, 0);
     uid_t uid = getuid();
     int tag = arc4random();
+    int ref_cnt;
+    uint64_t dummy_sk;
     EXPECT_EQ(0, qtaguid_tagSocket(sockfd, tag, uid));
-    EXPECT_GE(2, getCtrlRefCnt(tag, uid));
+    EXPECT_EQ(0, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
+    EXPECT_EQ(2, ref_cnt);
     close(sockfd);
-    EXPECT_EQ(-ENOENT, getCtrlRefCnt(tag, uid));
+    EXPECT_EQ(-ENOENT, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
 }
 
-TEST (NativeSocketRefCnt, close_socket_without_untag_ipv6) {
+TEST (NativeQtaguidTest, close_socket_without_untag_ipv6) {
     int sockfd = socket(AF_INET6, SOCK_STREAM, 0);
     uid_t uid = getuid();
     int tag = arc4random();
+    int ref_cnt;
+    uint64_t dummy_sk;
     EXPECT_EQ(0, qtaguid_tagSocket(sockfd, tag, uid));
-    EXPECT_GE(2, getCtrlRefCnt(tag, uid));
+    EXPECT_EQ(0, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
+    EXPECT_EQ(2, ref_cnt);
     close(sockfd);
-    EXPECT_EQ(-ENOENT, getCtrlRefCnt(tag, uid));
+    EXPECT_EQ(-ENOENT, getCtrlSkInfo(tag, uid, &dummy_sk, &ref_cnt));
+}
+
+TEST (NativeQtaguidTest, no_socket_addr_leak) {
+  checkNoSocketPointerLeaks(AF_INET);
+  checkNoSocketPointerLeaks(AF_INET6);
 }
 
 int main(int argc, char **argv) {
