socketTag.cpp revision 73b89ae952174d04c34623ec40267829236dbcf9
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 */ 1773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/* 1873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This socket tagging test is to ensure that the 1973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * netfilter/xt_qtaguid kernel module somewhat behaves as expected 2073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * with respect to tagging sockets. 2173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */ 2273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <assert.h> 2373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <errno.h> 2473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <fcntl.h> 2573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdio.h> 2673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdlib.h> 2773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/socket.h> 2873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/types.h> 2973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <string> 3073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 3173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#define LOG_TAG "socketTagTest" 3273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <utils/Log.h> 3373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <testUtil.h> 3473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 3573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 3673b89ae952174d04c34623ec40267829236dbcf9JP Abgrallclass SockInfo { 3773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallpublic: 3873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall SockInfo() 3973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall : fd(-1), addr(NULL) {}; 4073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int setup(uint64_t tag); 4173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall bool checkTag(uint64_t tag, uid_t uid); 4273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int fd; 4373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall void *addr; 4473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}; 4573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 4673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 4773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint openCtrl() { 4873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl; 4973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl = open("/proc/net/xt_qtaguid/ctrl", O_RDWR); 5073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!ctrl) { 5173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid ctrl open failed: %s", strerror(errno)); 5273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 5373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return ctrl; 5473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 5573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 5673b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint doCtrlCommand(const char *fmt, ...) { 5773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *buff; 5873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl; 5973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 6073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall va_list argp; 6173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 6273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall va_start(argp, fmt); 6373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl = openCtrl(); 6473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall vasprintf(&buff, fmt, argp); 6573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall errno = 0; 6673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = write(ctrl, buff, strlen(buff)); 6773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("cmd: '%s' res=%d %d/%s", buff, res, errno, strerror(errno)); 6873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl); 6973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall free(buff); 7073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall va_end(argp); 7173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return res; 7273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 7373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 7473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 7573b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint writeModuleParam(const char *param, const char *data) { 7673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int param_fd; 7773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 7873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall std::string filename("/sys/module/xt_qtaguid/parameters/"); 7973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 8073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall filename += param; 8173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall param_fd = open(filename.c_str(), O_WRONLY); 8273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (param_fd < 0) { 8373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid param open failed: %s", strerror(errno)); 8473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 8573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 8673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = write(param_fd, data, strlen(data)); 8773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 8873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid param write failed: %s", strerror(errno)); 8973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 9073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(param_fd); 9173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return res; 9273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 9373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/ 9473b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint SockInfo::setup(uint64_t tag) { 9573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall fd = socket(AF_INET, SOCK_STREAM, 0); 9673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (fd < 0) { 9773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket creation failed: %s", strerror(errno)); 9873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 9973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 10073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (doCtrlCommand("t %d %llu", fd, tag) < 0) { 10173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup: failed to tag"); 10273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(fd); 10373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 10473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 10573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!checkTag(tag, getuid())) { 10673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup: Unexpected results: tag not found"); 10773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(fd); 10873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 10973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 11073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (doCtrlCommand("u %d", fd) < 0) { 11173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup: Unexpected results"); 11273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(fd); 11373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return -1; 11473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 11573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return 0; 11673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 11773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 11873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/* checkTag() also tries to lookup the socket address in the kernel and 11973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * return it when *addr == NULL. 12073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This allows for better look ups when another process is also setting the same 12173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * tag + uid. But it is not fool proof. 12273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Without the kernel reporting more info on who setup the socket tag, it is 12373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * not easily verifiable from user-space. 12473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Returns: true if tag found. 12573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */ 12673b89ae952174d04c34623ec40267829236dbcf9JP Abgrallbool SockInfo::checkTag(uint64_t acct_tag, uid_t uid) { 12773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl_fd; 12873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl_fd = openCtrl(); 12973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char ctrl_data[1024]; 13073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ssize_t read_size; 13173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *buff; 13273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *pos; 13373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 13473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *match_template; 13573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t k_tag; 13673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint32_t k_uid; 13773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t full_tag; 13873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall long dummy_count; 13973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall pid_t dummy_pid; 14073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 14173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall read_size = read(ctrl_fd, ctrl_data, sizeof(ctrl_data)); 14273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (read_size < 0) { 14373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("Unable to read active tags from ctrl %d/%s", 14473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall errno, strerror(errno)); 14573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 14673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl_data[read_size] = '\0'; 14773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("<ctrl_raw_data>\n%s</ctrl_raw_data>", ctrl_data); 14873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 14973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (addr) { 15073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall assert(sizeof(void*) == sizeof(long int)); // Why does %p use 0x? grrr. %lx. 15173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall asprintf(&match_template, "sock=%lx %s", addr, "tag=0x%llx (uid=%u)"); 15273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 15373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall else { 15473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall /* Allocate for symmetry */ 15573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall asprintf(&match_template, "%s", " tag=0x%llx (uid=%u)"); 15673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 15773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 15873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall full_tag = acct_tag | uid; 15973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 16073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall asprintf(&buff, match_template, full_tag | uid, uid); 16173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("looking for '%s'", buff); 16273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall pos = strstr(ctrl_data, buff); 16373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 16473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (pos && !addr) { 16573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall assert(sizeof(void*) == sizeof(long int)); // Why does %p use 0x? grrr. %lx. 16673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = sscanf(pos - strlen("sock=1234abcd"), 16773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall "sock=%lx tag=0x%llx (uid=%lu) pid=%u f_count=%lu", 16873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall &addr, &k_tag, &k_uid, &dummy_pid, &dummy_count ); 16973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!(res == 5 && k_tag == full_tag && k_uid == uid)) { 17073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("Unable to read sock addr res=%d", res); 17173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall addr = 0; 17273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 17373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall else { 17473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("Got sock_addr %lx", addr); 17573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 17673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 17773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall free(buff); 17873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall free(match_template); 17973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl_fd); 18073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return pos != NULL; 18173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 18273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 18373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/ 18473b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint testSocketTagging(void) { 18573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall SockInfo sock0; 18673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall SockInfo sock1; 18773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 18873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int total_errors = 0; 18973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl_fd = -1; 19073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int dev_fd = -1; 19173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall const uint64_t invalid_tag1 = 0x0000000100000001llu; 19273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t valid_tag1; 19373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t valid_tag2; 19473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t max_uint_tag = 0xffffffff00000000llu; 19573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uid_t fake_uid; 19673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uid_t fake_uid2; 19773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall const char *test_name; 19873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uid_t my_uid = getuid(); 19973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall pid_t my_pid = getpid(); 20073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 20173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall srand48(my_pid * my_uid); 20273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall /* Adjust fake UIDs and tags so that multiple instances can run in parallel. */ 20373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall fake_uid = testRand(); 20473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall fake_uid2 = testRand(); 20573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); 20673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); 20773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall max_uint_tag = 1llu << 63 | (((uint64_t)my_pid << 48) ^ max_uint_tag); 20873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testSetLogCatTag(LOG_TAG); 20973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 21073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("** %s ** ============================", __FUNCTION__); 21173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu" 21273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall " tag1=0x%llx/%llu tag2=0x%llx/%llu", 21373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2, 21473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall valid_tag1, valid_tag1, valid_tag2, valid_tag2); 21573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 21673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 21773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "kernel has qtaguid"; 21873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s ", test_name); 21973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl_fd = openCtrl(); 22073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (ctrl_fd < 0) { 22173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid ctrl open failed: %s", strerror(errno)); 22273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 22373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall goto done; 22473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 22573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl_fd); 22673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall dev_fd = open("/dev/xt_qtaguid", O_RDONLY); 22773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (dev_fd < 0) { 22873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid dev open failed: %s", strerror(errno)); 22973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 23073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 23173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 23273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "delete command doesn't fail"; 23373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 23473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("d 0 %u", fake_uid); 23573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 23673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 23773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 23873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 23973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 24073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("d 0 %u", fake_uid2); 24173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 24273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 24373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 24473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 24573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 24673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("d 0 %u", my_uid); 24773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 24873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 24973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 25073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 25173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 25273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "setup sock0 and addr via tag"; 25373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 25473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.setup(valid_tag1) < 0) { 25573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup failed: %s", strerror(errno)); 25673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 25773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall goto done; 25873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 25973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 26073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 26173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "setup sock1 and addr via tag"; 26273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 26373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock1.setup(valid_tag1) < 0) { 26473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup failed: %s", strerror(errno)); 26573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 26673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall goto done; 26773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 26873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 26973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "insufficient args. Expected failure"; 27073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 27173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t"); 27273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 27373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 27473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 27573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 27673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 27773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 27873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "bad command. Expected failure"; 27973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 28073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("?"); 28173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 28273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 28373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 28473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 28573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 28673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 28773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "no tag, no uid"; 28873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 28973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d", sock0.fd); 29073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 29173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 29273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 29373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 29473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(0, my_uid)) { 29573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 29673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 29773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 29873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 29973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 30073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "invalid tag. Expected failure"; 30173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 30273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu", sock0.fd, invalid_tag1); 30373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 30473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 30573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 30673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 30773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.checkTag(invalid_tag1, my_uid)) { 30873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag should not be there", test_name); 30973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 31073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 31173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 31273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 31373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid tag with no uid"; 31473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 31573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu", sock0.fd, valid_tag1); 31673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 31773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 31873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 31973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 32073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(valid_tag1, my_uid)) { 32173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 32273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 32373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 32473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 32573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid untag"; 32673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 32773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("u %d", sock0.fd); 32873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 32973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 33073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 33173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 33273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.checkTag(valid_tag1, my_uid)) { 33373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not removed", test_name); 33473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 33573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 33673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 33773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 33873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid 1st tag"; 33973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 34073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid); 34173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 34273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 34373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 34473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 34573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(valid_tag2, fake_uid)) { 34673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 34773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 34873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 34973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 35073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 35173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid re-tag"; 35273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 35373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid); 35473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 35573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 35673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 35773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 35873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(valid_tag2, fake_uid)) { 35973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 36073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 36173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 36273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 36373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 36473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid re-tag with acct_tag change"; 36573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 36673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, fake_uid); 36773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 36873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 36973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 37073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 37173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(valid_tag1, fake_uid)) { 37273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 37373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 37473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 37573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 37673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 37773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "re-tag with uid change"; 37873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 37973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid2); 38073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 38173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 38273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 38373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 38473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(valid_tag2, fake_uid2)) { 38573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 38673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 38773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 38873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 38973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 39073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid 64bit acct tag"; 39173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 39273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu", sock0.fd, max_uint_tag); 39373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 39473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 39573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 39673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 39773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(max_uint_tag, my_uid)) { 39873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 39973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 40073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 40173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 40273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 40373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "tag another socket"; 40473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 40573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock1.fd, valid_tag1, fake_uid2); 40673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 40773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 40873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 40973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 41073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock1.checkTag(valid_tag1, fake_uid2)) { 41173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 41273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 41373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 41473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 41573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 41673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid untag"; 41773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 41873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("u %d", sock0.fd); 41973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 42073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 42173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 42273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 42373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.checkTag(max_uint_tag, fake_uid)) { 42473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag should not be there", test_name); 42573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 42673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 42773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock1.checkTag(valid_tag1, fake_uid2)) { 42873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 42973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 43073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 43173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("u %d", sock1.fd); 43273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 43373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 43473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 43573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 43673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock1.checkTag(valid_tag1, fake_uid2)) { 43773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag should not be there", test_name); 43873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 43973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 44073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 44173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 44273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "invalid sock0.fd. Expected failure"; 44373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 44473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(sock0.fd); 44573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, my_uid); 44673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 44773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 44873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 44973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 45073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.checkTag(valid_tag1, my_uid)) { 45173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag should not be there", test_name); 45273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 45373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 45473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 45573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 45673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "invalid untag. Expected failure"; 45773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 45873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(sock1.fd); 45973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("u %d", sock1.fd); 46073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 46173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 46273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 46373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 46473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 46573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (total_errors) { 46673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! Errors found"); 46773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } else { 46873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("No Errors found"); 46973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 47073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 47173b89ae952174d04c34623ec40267829236dbcf9JP Abgralldone: 47273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (dev_fd >= 0) { 47373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(dev_fd); 47473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 47573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (ctrl_fd >= 0) { 47673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl_fd); 47773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 47873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return total_errors; 47973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 48073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 48173b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint testTagData(void) { 48273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall SockInfo sock0; 48373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall SockInfo sock1; 48473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res; 48573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int total_errors = 0; 48673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int ctrl_fd = -1; 48773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int dev_fd = -1; 48873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall const uint64_t invalid_tag1 = 0x0000000100000001llu; 48973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t valid_tag1; 49073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t valid_tag2; 49173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t max_uint_tag = 0xffffffff00000000llu; 49273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uid_t fake_uid; 49373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uid_t fake_uid2; 49473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall const char *test_name; 49573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uid_t my_uid = getuid(); 49673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall pid_t my_pid = getpid(); 49773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall const int max_tags = 5; 49873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 49973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall srand48(my_pid * my_uid); 50073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall /* Adjust fake UIDs and tags so that multiple instances can run in parallel. */ 50173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall fake_uid = testRand(); 50273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall fake_uid2 = testRand(); 50373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); 50473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); 50573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall valid_tag2 &= 0xffffff00ffffffffllu; // Leave some room to make counts visible. 50673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testSetLogCatTag(LOG_TAG); 50773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 50873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("** %s ** ============================", __FUNCTION__); 50973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu" 51073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall " tag1=0x%llx/%llu tag2=0x%llx/%llu", 51173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2, 51273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall valid_tag1, valid_tag1, valid_tag2, valid_tag2); 51373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 51473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 51573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "kernel has qtaguid"; 51673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s ", test_name); 51773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall ctrl_fd = openCtrl(); 51873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (ctrl_fd < 0) { 51973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("qtaguid ctrl open failed: %s", strerror(errno)); 52073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return 1; 52173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 52273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl_fd); 52373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall dev_fd = open("/dev/xt_qtaguid", O_RDONLY); 52473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (dev_fd < 0) { 52573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: qtaguid dev open failed: %s", test_name, strerror(errno)); 52673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 52773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 52873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 52973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "delete command doesn't fail"; 53073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 53173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("d 0 %u", fake_uid); 53273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 53373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 53473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 53573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 53673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 53773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("d 0 %u", fake_uid2); 53873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 53973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 54073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 54173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 54273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 54373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("d 0 %u", my_uid); 54473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 54573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 54673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 54773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 54873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 54973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 55073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "setup sock0 and addr via tag"; 55173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 55273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.setup(valid_tag1)) { 55373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup failed: %s", strerror(errno)); 55473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return 1; 55573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 55673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 55773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "setup sock1 and addr via tag"; 55873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 55973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock1.setup(valid_tag1)) { 56073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("socket setup failed: %s", strerror(errno)); 56173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return 1; 56273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 56373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 56473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "setup tag limit"; 56573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s ", test_name); 56673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall char *max_tags_str; 56773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall asprintf(&max_tags_str, "%d", max_tags); 56873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = writeModuleParam("max_sock_tags", max_tags_str); 56973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 57073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 57173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall free(max_tags_str); 57273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return 1; 57373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 57473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 57573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 57673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "tag quota reach limit"; 57773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 57873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall for (int cnt = 0; cnt < max_tags; cnt++ ) { 57973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t new_tag = valid_tag2 + ((uint64_t)cnt << 32); 58073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); 58173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 58273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 58373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 58473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 58573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(new_tag, fake_uid2)) { 58673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 58773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 58873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 58973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 59073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "tag quota go over limit"; 59173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 59273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall { 59373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32); 59473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); 59573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 59673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 59773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 59873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 59973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2)) { 60073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 60173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 60273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 60373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 60473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 60573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 60673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "valid untag"; 60773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 60873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("u %d", sock0.fd); 60973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 61073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 61173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 61273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 61373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2)) { 61473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag should not be there", test_name); 61573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 61673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 61773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 61873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 61973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "tag after untag shouldn't free up max tags"; 62073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 62173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall { 62273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32); 62373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); 62473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 62573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 62673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 62773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 62873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.checkTag(valid_tag2 + ((uint64_t)max_tags << 32), fake_uid2)) { 62973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag should not be there", test_name); 63073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 63173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 63273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 63373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 63473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 63573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "delete one tag"; 63673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 63773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall { 63873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t new_tag = valid_tag2 + (((uint64_t)max_tags / 2) << 32); 63973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("d %llu %u", new_tag, fake_uid2); 64073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 64173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 64273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 64373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 64473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 64573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 64673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 64773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall test_name = "2 tags after 1 delete pass/fail"; 64873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("* test: %s", test_name); 64973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall { 65073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall uint64_t new_tag; 65173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall new_tag = valid_tag2 + (((uint64_t)max_tags + 1 ) << 32); 65273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); 65373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res < 0) { 65473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 65573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 65673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 65773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (!sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 1) << 32), fake_uid2)) { 65873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag not found", test_name); 65973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 66073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 66173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 66273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall new_tag = valid_tag2 + (((uint64_t)max_tags + 2 ) << 32); 66373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); 66473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res > 0) { 66573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results", test_name); 66673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 66773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 66873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 2) << 32), fake_uid2)) { 66973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! %s: Unexpected results: tag should not be there", test_name); 67073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall total_errors++; 67173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 67273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 67373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 67473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall /* TODO(jpa): test tagging two different sockets with same tags and 67573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * check refcounts the tag_node should be +2 67673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */ 67773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 67873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall // --------------- 67973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (total_errors) { 68073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("! Errors found"); 68173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } else { 68273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintI("No Errors found"); 68373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 68473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 68573b89ae952174d04c34623ec40267829236dbcf9JP Abgralldone: 68673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (dev_fd >= 0) { 68773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(dev_fd); 68873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 68973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (ctrl_fd >= 0) { 69073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall close(ctrl_fd); 69173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 69273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return total_errors; 69373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 69473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 69573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/ 69673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall 69773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint main(int argc, char *argv[]) { 69873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall int res = 0; 69973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res += testTagData(); 70073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall res += testSocketTagging(); 70173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall if (res) { 70273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("!! %d Errors found", res); 70373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } else { 70473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall testPrintE("No Errors found"); 70573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall } 70673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall return res; 70773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall} 708