1/* 2 Unix SMB/Netbios implementation. 3 Version 1.9. 4 Security context tests 5 Copyright (C) Tim Potter 2000 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20*/ 21 22#include "includes.h" 23#include "sec_ctx_utils.h" 24 25#define NUM_TESTS 10000 26 27int main (int argc, char **argv) 28{ 29 int seed, level = 0, num_tests = 0; 30 31 init_sec_ctx(); 32 33 if (argc == 1) { 34 seed = time(NULL); 35 } else { 36 seed = atoi(argv[1]); 37 } 38 39 printf("seed = %d\n", seed); 40 41 while(num_tests < NUM_TESTS) { 42 switch (random() % 2) { 43 44 /* Push a random context */ 45 46 case 0: 47 if (level < MAX_SEC_CTX_DEPTH) { 48 int ngroups; 49 gid_t *groups; 50 51 if (!push_sec_ctx()) { 52 printf("FAIL: push random ctx\n"); 53 return 1; 54 } 55 56 get_random_grouplist(&ngroups, &groups); 57 58 set_sec_ctx(random() % 32767, 59 random() % 32767, 60 ngroups, groups); 61 62 if (!verify_current_groups(ngroups, 63 groups)) { 64 printf("FAIL: groups did not stick\n"); 65 return 1; 66 } 67 68 printf("pushed (%d, %d) eff=(%d, %d)\n", 69 getuid(), getgid(), geteuid(), 70 getegid()); 71 72 level++; 73 num_tests++; 74 75 free(groups); 76 } 77 break; 78 79 /* Pop a random context */ 80 81 case 1: 82 if (level > 0) { 83 if (!pop_sec_ctx()) { 84 printf("FAIL: pop random ctx\n"); 85 return 1; 86 } 87 88 printf("popped (%d, %d) eff=(%d, %d)\n", 89 getuid(), getgid(), geteuid(), 90 getegid()); 91 92 level--; 93 num_tests++; 94 } 95 break; 96 } 97 } 98 99 /* Everything's cool */ 100 101 printf("PASS\n"); 102 return 0; 103} 104