socketTag.cpp revision fa8469945ddaea6c5155d578aaeafb3b586c8084
173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/* 273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Copyright (C) 2011 The Android Open Source Project 373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * 473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Licensed under the Apache License, Version 2.0 (the "License"); 573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * you may not use this file except in compliance with the License. 673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * You may obtain a copy of the License at 773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * 873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * http://www.apache.org/licenses/LICENSE-2.0 973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * 1073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Unless requied by applicable law or agreed to in writing, software 1173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * distributed under the License is distributed on an "AS IS" BASIS, 1273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * See the License for the specific language governing permissions and 1473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * limitations under the License. 1573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * 1673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */ 17fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 1873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/* 1973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This socket tagging test is to ensure that the 2073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * netfilter/xt_qtaguid kernel module somewhat behaves as expected 2173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * with respect to tagging sockets. 2273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */ 2373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <assert.h> 2473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <errno.h> 2573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <fcntl.h> 2673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdio.h> 2773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdlib.h> 28fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang#include <gtest/gtest.h> 2973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/socket.h> 3073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/types.h> 3173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <string> 3273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 3373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#define LOG_TAG "socketTagTest" 3473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <utils/Log.h> 3573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <testUtil.h> 3673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 37fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuangnamespace android { 3873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 3973b89ae952174d04c34623ec40267829236dbcf9JP Abgrallclass SockInfo { 4073b89ae952174d04c34623ec40267829236dbcf9JP Abgrallpublic: 41fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang SockInfo() : fd(-1), addr(NULL) {}; 42fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang int setup(uint64_t tag); 43fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang bool checkTag(uint64_t tag, uid_t uid); 44fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang int fd; 45fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang void *addr; 4673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}; 4773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 4873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 4973b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint openCtrl() { 5073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl; 5173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl = open("/proc/net/xt_qtaguid/ctrl", O_RDWR); 5273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!ctrl) { 5373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid ctrl open failed: %s", strerror(errno)); 5473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 5573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return ctrl; 5673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 5773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 5873b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint doCtrlCommand(const char *fmt, ...) { 5973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *buff; 6073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl; 6173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 6273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall va_list argp; 6373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 6473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall va_start(argp, fmt); 6573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl = openCtrl(); 6673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall vasprintf(&buff, fmt, argp); 6773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall errno = 0; 6873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = write(ctrl, buff, strlen(buff)); 6973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("cmd: '%s' res=%d %d/%s", buff, res, errno, strerror(errno)); 7073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl); 7173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall free(buff); 7273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall va_end(argp); 7373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return res; 7473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 7573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 7673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 7773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint writeModuleParam(const char *param, const char *data) { 7873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int param_fd; 7973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 8073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall std::string filename("/sys/module/xt_qtaguid/parameters/"); 8173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 8273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall filename += param; 8373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall param_fd = open(filename.c_str(), O_WRONLY); 8473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (param_fd < 0) { 8573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid param open failed: %s", strerror(errno)); 8673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 8773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 8873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = write(param_fd, data, strlen(data)); 8973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 9073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid param write failed: %s", strerror(errno)); 9173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 9273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(param_fd); 9373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return res; 9473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 95fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 9673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/ 9773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint SockInfo::setup(uint64_t tag) { 9873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall fd = socket(AF_INET, SOCK_STREAM, 0); 9973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (fd < 0) { 10073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket creation failed: %s", strerror(errno)); 10173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 10273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 10373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (doCtrlCommand("t %d %llu", fd, tag) < 0) { 10473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup: failed to tag"); 10573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(fd); 10673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 10773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 10873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!checkTag(tag, getuid())) { 10973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup: Unexpected results: tag not found"); 11073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(fd); 11173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 11273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 11373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (doCtrlCommand("u %d", fd) < 0) { 11473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup: Unexpected results"); 11573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(fd); 11673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 11773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 11873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return 0; 11973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 12073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 12173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/* checkTag() also tries to lookup the socket address in the kernel and 12273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * return it when *addr == NULL. 12373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This allows for better look ups when another process is also setting the same 12473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * tag + uid. But it is not fool proof. 12573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Without the kernel reporting more info on who setup the socket tag, it is 12673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * not easily verifiable from user-space. 12773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Returns: true if tag found. 12873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */ 12973b89ae952174d04c34623ec40267829236dbcf9JP Abgrallbool SockInfo::checkTag(uint64_t acct_tag, uid_t uid) { 13073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl_fd; 13173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl_fd = openCtrl(); 13273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char ctrl_data[1024]; 13373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ssize_t read_size; 13473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *buff; 13573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *pos; 13673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 13773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *match_template; 13873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t k_tag; 13973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint32_t k_uid; 14073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t full_tag; 14173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall long dummy_count; 14273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall pid_t dummy_pid; 14373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 14473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall read_size = read(ctrl_fd, ctrl_data, sizeof(ctrl_data)); 14573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (read_size < 0) { 14673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("Unable to read active tags from ctrl %d/%s", 14773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall errno, strerror(errno)); 14873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 14973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl_data[read_size] = '\0'; 15073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("<ctrl_raw_data>\n%s</ctrl_raw_data>", ctrl_data); 15173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 15273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (addr) { 15373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall assert(sizeof(void*) == sizeof(long int)); // Why does %p use 0x? grrr. %lx. 15473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall asprintf(&match_template, "sock=%lx %s", addr, "tag=0x%llx (uid=%u)"); 15573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 15673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall else { 15773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall /* Allocate for symmetry */ 15873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall asprintf(&match_template, "%s", " tag=0x%llx (uid=%u)"); 15973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 16073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 16173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall full_tag = acct_tag | uid; 16273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 16373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall asprintf(&buff, match_template, full_tag | uid, uid); 16473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("looking for '%s'", buff); 16573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall pos = strstr(ctrl_data, buff); 16673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 16773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (pos && !addr) { 16873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall assert(sizeof(void*) == sizeof(long int)); // Why does %p use 0x? grrr. %lx. 16973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = sscanf(pos - strlen("sock=1234abcd"), 17073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall "sock=%lx tag=0x%llx (uid=%lu) pid=%u f_count=%lu", 17173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall &addr, &k_tag, &k_uid, &dummy_pid, &dummy_count ); 17273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!(res == 5 && k_tag == full_tag && k_uid == uid)) { 17373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("Unable to read sock addr res=%d", res); 17473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall addr = 0; 17573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 17673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall else { 17773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("Got sock_addr %lx", addr); 17873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 17973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 18073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall free(buff); 18173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall free(match_template); 18273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl_fd); 18373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return pos != NULL; 18473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 18573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 18673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 187fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuangclass SocketTaggingTest : public ::testing::Test { 188fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuangprotected: 189fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang virtual void SetUp() { 190fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ctrl_fd = -1; 191fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang dev_fd = -1; 192fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang my_uid = getuid(); 193fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang my_pid = getpid(); 194fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang srand48(my_pid * my_uid); 195fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Adjust fake UIDs and tags so that multiple instances can run in parallel. 196fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang fake_uid = testRand(); 197fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang fake_uid2 = testRand(); 198fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); 199fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); 200fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang valid_tag2 &= 0xffffff00ffffffffllu; // Leave some room to make counts visible. 201fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu" 202fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang " tag1=0x%llx/%llu tag2=0x%llx/%llu", 203fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2, 204fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang valid_tag1, valid_tag1, valid_tag2, valid_tag2); 205fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang max_uint_tag = 0xffffffff00000000llu; 206fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang max_uint_tag = 1llu << 63 | (((uint64_t)my_pid << 48) ^ max_uint_tag); 207fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 208fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("kernel has qtaguid"); 209fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ctrl_fd = openCtrl(); 210fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ASSERT_GE(ctrl_fd, 0) << "qtaguid ctrl open failed"; 211fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang close(ctrl_fd); 212fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang dev_fd = open("/dev/xt_qtaguid", O_RDONLY); 213fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(dev_fd, 0) << "qtaguid dev open failed"; 214fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 215fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // We want to clean up any previous faulty test runs. 216fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("delete command does not fail"); 217fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("d 0 %u", fake_uid), 0) << "Failed to delete fake_uid"; 218fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("d 0 %u", fake_uid2), 0) << "Failed to delete fake_uid2"; 219fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("d 0 %u", my_uid), 0) << "Failed to delete my_uid"; 220fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 221fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("setup sock0 and addr via tag"); 222fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ASSERT_FALSE(sock0.setup(valid_tag1)) << "socket0 setup failed"; 223fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("setup sock1 and addr via tag"); 224fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ASSERT_FALSE(sock1.setup(valid_tag1)) << "socket1 setup failed"; 225fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang } 226fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 227fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang virtual void TearDown() { 228fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang if (dev_fd >= 0) { 229fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang close(dev_fd); 230fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang } 231fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang if (ctrl_fd >= 0) { 232fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang close(ctrl_fd); 233fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang } 234fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang } 235fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 236fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang SockInfo sock0; 237fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang SockInfo sock1; 238fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang int ctrl_fd; 239fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang int dev_fd; 240fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uid_t fake_uid; 241fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uid_t fake_uid2; 242fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uid_t my_uid; 243fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang pid_t my_pid; 244fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t valid_tag1; 245fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t valid_tag2; 246fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t max_uint_tag; 247fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang static const uint64_t invalid_tag1 = 0x0000000100000001llu; 248fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang static const int max_tags = 5; 249fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}; 25073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 251fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, TagData) { 252fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang max_uint_tag = 0xffffffff00000000llu; 253fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang char *max_tags_str; 25473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 255fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("setup tag limit"); 256fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang asprintf(&max_tags_str, "%d", max_tags); 257fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ASSERT_GE(writeModuleParam("max_sock_tags", max_tags_str), 0) << "Failed to setup tag limit"; 25873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 259fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("tag quota reach limit"); 260fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang for (int cnt = 0; cnt < max_tags; cnt++ ) { 261fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t tag = valid_tag2 + ((uint64_t)cnt << 32); 262fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, tag , fake_uid2), 0) 263fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang << "Tagging within limit failed"; 264fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(tag, fake_uid2))<< "Unexpected results: tag not found"; 265fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang } 266fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 267fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("tag quota go over limit"); 268fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32); 269fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LT(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2), 0); 270fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), 271fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang fake_uid2)) << "Unexpected results: tag not found"; 272fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 273fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("valid untag"); 274fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("u %d", sock0.fd), 0); 275fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_FALSE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2)) 276fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang << "Untagged tag should not be there"; 277fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 278fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("tag after untag should not free up max tags"); 279fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t new_tag2 = valid_tag2 + ((uint64_t)max_tags << 32); 280fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LT(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag2 , fake_uid2), 0); 281fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_FALSE(sock0.checkTag(valid_tag2 + ((uint64_t)max_tags << 32), fake_uid2)) 282fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang << "Tag should not be there"; 283fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 284fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("delete one tag"); 285fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t new_tag3 = valid_tag2 + (((uint64_t)max_tags / 2) << 32); 286fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("d %llu %u", new_tag3, fake_uid2), 0); 287fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 288fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("2 tags after 1 delete pass/fail"); 289fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang uint64_t new_tag4; 290fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang new_tag4 = valid_tag2 + (((uint64_t)max_tags + 1 ) << 32); 291fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag4 , fake_uid2), 0); 292fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 1) << 32), fake_uid2)) 293fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang << "Tag not found"; 294fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang new_tag4 = valid_tag2 + (((uint64_t)max_tags + 2 ) << 32); 295fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LT(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag4 , fake_uid2), 0); 296fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_FALSE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 2) << 32), fake_uid2)) 297fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang << "Tag should not be there"; 29873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 299fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang /* TODO(jpa): test tagging two different sockets with same tags and 300fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang * check refcounts the tag_node should be +2 301fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang */ 30273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 30373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 304fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, InsufficientArgsFails) { 305fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Insufficient args. Expected failure 306fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LE(doCtrlCommand("t"), 0) << "Insufficient args, should fail."; 307fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 30873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 309fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, BadCommandFails) { 310fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Bad command. Expected failure"; 311fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LE(doCtrlCommand("?"), 0) << "Bad command, should fail"; 312fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 31373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 314fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, NoTagNoUid) { 315fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // no tag, no uid 316fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d", sock0.fd), 0); 317fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ASSERT_TRUE(sock0.checkTag(0, my_uid)) << "Tag not found"; 318fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 31973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 320fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, InvalidTagFail) { 321fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Invalid tag. Expected failure 322fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LE(doCtrlCommand("t %d %llu", sock0.fd, invalid_tag1), 0); 323fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang ASSERT_FALSE(sock0.checkTag(invalid_tag1, my_uid)) << "Tag should not be there"; 324fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 32573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 326fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidTagWithNoUid) { 327fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Valid tag with no uid 328fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, valid_tag1), 0); 329fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(valid_tag1, my_uid)) << "Tag not found"; 330fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 33173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 332fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidUntag) { 333fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Valid untag 334fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, valid_tag1), 0); 335fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(valid_tag1, my_uid)) << "Tag not found"; 336fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("u %d", sock0.fd), 0); 337fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_FALSE(sock0.checkTag(valid_tag1, my_uid)) << "Tag should be removed"; 338fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 33973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 340fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidFirsttag) { 341fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Valid 1st tag 342fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0); 343fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(valid_tag2, fake_uid)) << "Tag not found."; 344fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 34573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 346fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidReTag) { 347fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Valid re-tag 348fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0); 349fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0); 350fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(valid_tag2, fake_uid)) << "Tag not found."; 351fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 35273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 353fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidReTagWithAcctTagChange) { 354fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Valid re-tag with acct_tag change 355fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0); 356fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, fake_uid), 0); 357fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(valid_tag1, fake_uid)) << "Tag not found."; 358fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 35973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 360fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ReTagWithUidChange) { 361fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Re-tag with uid change 362fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, fake_uid), 0); 363fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid2), 0); 364fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 36573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 366fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, Valid64BitAcctTag) { 367fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Valid 64bit acct tag 368fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, max_uint_tag), 0); 369fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock0.checkTag(max_uint_tag, my_uid)) << "Tag not found."; 370fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 37173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 372fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, TagAnotherSocket) { 373fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("Tag two sockets"); 374fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, max_uint_tag), 0); 375fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("t %d %llu %u", sock1.fd, valid_tag1, fake_uid2), 0); 376fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock1.checkTag(valid_tag1, fake_uid2)) << "Tag not found."; 377fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("Untag socket0 of them only."); 378fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("u %d", sock0.fd), 0); 379fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_FALSE(sock0.checkTag(max_uint_tag, fake_uid)) << "Tag should not be there"; 380fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_TRUE(sock1.checkTag(valid_tag1, fake_uid2)) << "Tag not found"; 381fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang testPrintI("Now untag socket1 as well."); 382fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_GE(doCtrlCommand("u %d", sock1.fd), 0); 383fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_FALSE(sock1.checkTag(valid_tag1, fake_uid2)) << "Tag should not be there"; 38473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 38573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 386fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, TagInvalidSocketFail) { 387fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Invalid tag. Expected failure 388fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang close(sock0.fd); 389fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, my_uid), 0); 390fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_FALSE(sock0.checkTag(valid_tag1, my_uid)) << "Tag should not be there"; 391fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} 39273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 393fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, UntagInvalidSocketFail) { 394fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang // Invalid untag. Expected failure"; 395fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang close(sock1.fd); 396fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang EXPECT_LE(doCtrlCommand("u %d", sock1.fd), 0); 39773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 398fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang 399fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang} // namespace android 400