16cd6a6acSopenharmony_ci/* 26cd6a6acSopenharmony_ci * Author: Joshua Brindle <jbrindle@tresys.com> 36cd6a6acSopenharmony_ci * 46cd6a6acSopenharmony_ci * Copyright (C) 2006 Tresys Technology, LLC 56cd6a6acSopenharmony_ci * 66cd6a6acSopenharmony_ci * This library is free software; you can redistribute it and/or 76cd6a6acSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 86cd6a6acSopenharmony_ci * License as published by the Free Software Foundation; either 96cd6a6acSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 106cd6a6acSopenharmony_ci * 116cd6a6acSopenharmony_ci * This library is distributed in the hope that it will be useful, 126cd6a6acSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 136cd6a6acSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 146cd6a6acSopenharmony_ci * Lesser General Public License for more details. 156cd6a6acSopenharmony_ci * 166cd6a6acSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 176cd6a6acSopenharmony_ci * License along with this library; if not, write to the Free Software 186cd6a6acSopenharmony_ci * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 196cd6a6acSopenharmony_ci */ 206cd6a6acSopenharmony_ci 216cd6a6acSopenharmony_ci/* This is where the linker tests should go, including: 226cd6a6acSopenharmony_ci * - check role, type, bool, user, attr mapping 236cd6a6acSopenharmony_ci * - check for properly enabled optional 246cd6a6acSopenharmony_ci * - check for properly disabled optional 256cd6a6acSopenharmony_ci * - check for non-optional disabled blocks 266cd6a6acSopenharmony_ci * - properly add symbols declared in optionals 276cd6a6acSopenharmony_ci */ 286cd6a6acSopenharmony_ci 296cd6a6acSopenharmony_ci#include "test-linker.h" 306cd6a6acSopenharmony_ci#include "parse_util.h" 316cd6a6acSopenharmony_ci#include "helpers.h" 326cd6a6acSopenharmony_ci#include "test-common.h" 336cd6a6acSopenharmony_ci#include "test-linker-roles.h" 346cd6a6acSopenharmony_ci#include "test-linker-types.h" 356cd6a6acSopenharmony_ci#include "test-linker-cond-map.h" 366cd6a6acSopenharmony_ci 376cd6a6acSopenharmony_ci#include <sepol/policydb/policydb.h> 386cd6a6acSopenharmony_ci#include <sepol/policydb/link.h> 396cd6a6acSopenharmony_ci#include <sepol/policydb/conditional.h> 406cd6a6acSopenharmony_ci#include <sepol/policydb/expand.h> 416cd6a6acSopenharmony_ci#include <limits.h> 426cd6a6acSopenharmony_ci#include <stdlib.h> 436cd6a6acSopenharmony_ci 446cd6a6acSopenharmony_ci#define NUM_MODS 2 456cd6a6acSopenharmony_ci#define NUM_POLICIES NUM_MODS+1 466cd6a6acSopenharmony_ci 476cd6a6acSopenharmony_ci#define BASEMOD NUM_MODS 486cd6a6acSopenharmony_ciconst char *policies[NUM_POLICIES] = { 496cd6a6acSopenharmony_ci "module1.conf", 506cd6a6acSopenharmony_ci "module2.conf", 516cd6a6acSopenharmony_ci "small-base.conf", 526cd6a6acSopenharmony_ci}; 536cd6a6acSopenharmony_ci 546cd6a6acSopenharmony_cistatic policydb_t basenomods; 556cd6a6acSopenharmony_cistatic policydb_t linkedbase; 566cd6a6acSopenharmony_cistatic policydb_t *modules[NUM_MODS]; 576cd6a6acSopenharmony_ciextern int mls; 586cd6a6acSopenharmony_ci 596cd6a6acSopenharmony_ciint linker_test_init(void) 606cd6a6acSopenharmony_ci{ 616cd6a6acSopenharmony_ci int i; 626cd6a6acSopenharmony_ci 636cd6a6acSopenharmony_ci if (test_load_policy(&linkedbase, POLICY_BASE, mls, "test-linker", policies[BASEMOD])) 646cd6a6acSopenharmony_ci return -1; 656cd6a6acSopenharmony_ci 666cd6a6acSopenharmony_ci if (test_load_policy(&basenomods, POLICY_BASE, mls, "test-linker", policies[BASEMOD])) 676cd6a6acSopenharmony_ci return -1; 686cd6a6acSopenharmony_ci 696cd6a6acSopenharmony_ci for (i = 0; i < NUM_MODS; i++) { 706cd6a6acSopenharmony_ci 716cd6a6acSopenharmony_ci modules[i] = calloc(1, sizeof(*modules[i])); 726cd6a6acSopenharmony_ci if (!modules[i]) { 736cd6a6acSopenharmony_ci fprintf(stderr, "out of memory!\n"); 746cd6a6acSopenharmony_ci return -1; 756cd6a6acSopenharmony_ci } 766cd6a6acSopenharmony_ci 776cd6a6acSopenharmony_ci if (test_load_policy(modules[i], POLICY_MOD, mls, "test-linker", policies[i])) 786cd6a6acSopenharmony_ci return -1; 796cd6a6acSopenharmony_ci 806cd6a6acSopenharmony_ci } 816cd6a6acSopenharmony_ci 826cd6a6acSopenharmony_ci if (link_modules(NULL, &linkedbase, modules, NUM_MODS, 0)) { 836cd6a6acSopenharmony_ci fprintf(stderr, "link modules failed\n"); 846cd6a6acSopenharmony_ci return -1; 856cd6a6acSopenharmony_ci } 866cd6a6acSopenharmony_ci 876cd6a6acSopenharmony_ci if (link_modules(NULL, &basenomods, NULL, 0, 0)) { 886cd6a6acSopenharmony_ci fprintf(stderr, "link modules failed\n"); 896cd6a6acSopenharmony_ci return -1; 906cd6a6acSopenharmony_ci } 916cd6a6acSopenharmony_ci 926cd6a6acSopenharmony_ci return 0; 936cd6a6acSopenharmony_ci} 946cd6a6acSopenharmony_ci 956cd6a6acSopenharmony_ciint linker_test_cleanup(void) 966cd6a6acSopenharmony_ci{ 976cd6a6acSopenharmony_ci int i; 986cd6a6acSopenharmony_ci 996cd6a6acSopenharmony_ci policydb_destroy(&basenomods); 1006cd6a6acSopenharmony_ci policydb_destroy(&linkedbase); 1016cd6a6acSopenharmony_ci 1026cd6a6acSopenharmony_ci for (i = 0; i < NUM_MODS; i++) { 1036cd6a6acSopenharmony_ci policydb_destroy(modules[i]); 1046cd6a6acSopenharmony_ci free(modules[i]); 1056cd6a6acSopenharmony_ci } 1066cd6a6acSopenharmony_ci return 0; 1076cd6a6acSopenharmony_ci} 1086cd6a6acSopenharmony_ci 1096cd6a6acSopenharmony_cistatic void test_linker_indexes(void) 1106cd6a6acSopenharmony_ci{ 1116cd6a6acSopenharmony_ci test_policydb_indexes(&linkedbase); 1126cd6a6acSopenharmony_ci} 1136cd6a6acSopenharmony_ci 1146cd6a6acSopenharmony_cistatic void test_linker_roles(void) 1156cd6a6acSopenharmony_ci{ 1166cd6a6acSopenharmony_ci base_role_tests(&basenomods); 1176cd6a6acSopenharmony_ci base_role_tests(&linkedbase); 1186cd6a6acSopenharmony_ci module_role_tests(&linkedbase); 1196cd6a6acSopenharmony_ci} 1206cd6a6acSopenharmony_ci 1216cd6a6acSopenharmony_cistatic void test_linker_types(void) 1226cd6a6acSopenharmony_ci{ 1236cd6a6acSopenharmony_ci base_type_tests(&basenomods); 1246cd6a6acSopenharmony_ci base_type_tests(&linkedbase); 1256cd6a6acSopenharmony_ci module_type_tests(&linkedbase); 1266cd6a6acSopenharmony_ci} 1276cd6a6acSopenharmony_ci 1286cd6a6acSopenharmony_cistatic void test_linker_cond(void) 1296cd6a6acSopenharmony_ci{ 1306cd6a6acSopenharmony_ci base_cond_tests(&basenomods); 1316cd6a6acSopenharmony_ci base_cond_tests(&linkedbase); 1326cd6a6acSopenharmony_ci module_cond_tests(&linkedbase); 1336cd6a6acSopenharmony_ci} 1346cd6a6acSopenharmony_ci 1356cd6a6acSopenharmony_ciint linker_add_tests(CU_pSuite suite) 1366cd6a6acSopenharmony_ci{ 1376cd6a6acSopenharmony_ci if (NULL == CU_add_test(suite, "linker_indexes", test_linker_indexes)) { 1386cd6a6acSopenharmony_ci CU_cleanup_registry(); 1396cd6a6acSopenharmony_ci return CU_get_error(); 1406cd6a6acSopenharmony_ci } 1416cd6a6acSopenharmony_ci if (NULL == CU_add_test(suite, "linker_types", test_linker_types)) { 1426cd6a6acSopenharmony_ci CU_cleanup_registry(); 1436cd6a6acSopenharmony_ci return CU_get_error(); 1446cd6a6acSopenharmony_ci } 1456cd6a6acSopenharmony_ci if (NULL == CU_add_test(suite, "linker_roles", test_linker_roles)) { 1466cd6a6acSopenharmony_ci CU_cleanup_registry(); 1476cd6a6acSopenharmony_ci return CU_get_error(); 1486cd6a6acSopenharmony_ci } 1496cd6a6acSopenharmony_ci if (NULL == CU_add_test(suite, "linker_cond", test_linker_cond)) { 1506cd6a6acSopenharmony_ci CU_cleanup_registry(); 1516cd6a6acSopenharmony_ci return CU_get_error(); 1526cd6a6acSopenharmony_ci } 1536cd6a6acSopenharmony_ci return 0; 1546cd6a6acSopenharmony_ci} 155