Merge "Add test to check sock addr in qtaguid ctrl file" am: 7f67f4521d
am: 338fcfc742 Change-Id: Ie674dcb111e94c2cc52004cc6a4e83bcbadcc4ca
This commit is contained in:
@@ -23,7 +23,7 @@
|
|||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <cutils/qtaguid.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;
|
FILE *fp;
|
||||||
fp = fopen("/proc/net/xt_qtaguid/ctrl", "r");
|
fp = fopen("/proc/net/xt_qtaguid/ctrl", "r");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
@@ -38,43 +38,66 @@ int getCtrlRefCnt(int tag, uid_t uid) {
|
|||||||
if (strstr(line_buffer, pattern) == NULL)
|
if (strstr(line_buffer, pattern) == NULL)
|
||||||
continue;
|
continue;
|
||||||
int res;
|
int res;
|
||||||
uint32_t ref_cnt;
|
|
||||||
pid_t dummy_pid;
|
pid_t dummy_pid;
|
||||||
uint64_t dummy_sk;
|
|
||||||
uint64_t k_tag;
|
uint64_t k_tag;
|
||||||
uint32_t k_uid;
|
uint32_t k_uid;
|
||||||
const int TOTAL_PARAM = 5;
|
const int TOTAL_PARAM = 5;
|
||||||
res = sscanf(line_buffer, "sock=%" PRIx64 " tag=0x%" PRIx64 " (uid=%" PRIu32 ") "
|
res = sscanf(line_buffer, "sock=%" PRIx64 " tag=0x%" PRIx64 " (uid=%" PRIu32 ") "
|
||||||
"pid=%u f_count=%u", &dummy_sk, &k_tag, &k_uid,
|
"pid=%u f_count=%u", sk_addr, &k_tag, &k_uid,
|
||||||
&dummy_pid, &ref_cnt);
|
&dummy_pid, ref_cnt);
|
||||||
if (!(res == TOTAL_PARAM && k_tag == full_tag && k_uid == uid))
|
if (!(res == TOTAL_PARAM && k_tag == full_tag && k_uid == uid))
|
||||||
res = -EINVAL;
|
return -EINVAL;
|
||||||
res = ref_cnt;
|
|
||||||
free(line_buffer);
|
free(line_buffer);
|
||||||
return res;
|
return 0;
|
||||||
}
|
}
|
||||||
free(line_buffer);
|
free(line_buffer);
|
||||||
return -ENOENT;
|
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);
|
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
uid_t uid = getuid();
|
uid_t uid = getuid();
|
||||||
int tag = arc4random();
|
int tag = arc4random();
|
||||||
|
int ref_cnt;
|
||||||
|
uint64_t dummy_sk;
|
||||||
EXPECT_EQ(0, qtaguid_tagSocket(sockfd, tag, uid));
|
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);
|
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);
|
int sockfd = socket(AF_INET6, SOCK_STREAM, 0);
|
||||||
uid_t uid = getuid();
|
uid_t uid = getuid();
|
||||||
int tag = arc4random();
|
int tag = arc4random();
|
||||||
|
int ref_cnt;
|
||||||
|
uint64_t dummy_sk;
|
||||||
EXPECT_EQ(0, qtaguid_tagSocket(sockfd, tag, uid));
|
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);
|
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) {
|
int main(int argc, char **argv) {
|
||||||
|
|||||||
Reference in New Issue
Block a user