Home | History | Annotate | Download | only in test
      1 /* lib_test.c -- simple libcap-ng test suite
      2  * Copyright 2009,2012 Red Hat Inc., Durham, North Carolina.
      3  * All Rights Reserved.
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Lesser General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2.1 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Lesser General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Lesser General Public
     16  * License along with this library; if not, write to the Free Software
     17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     18  *
     19  * Authors:
     20  *      Steve Grubb <sgrubb (at) redhat.com>
     21  */
     22 
     23 #include "config.h"
     24 #include "../cap-ng.h"
     25 #include <stdlib.h>
     26 #include <stdio.h>
     27 #include <string.h>
     28 
     29 
     30 int main(void)
     31 {
     32 	int rc, i, len, last = CAP_LAST_CAP;
     33 	char *text;
     34 	void *saved;
     35 
     36 	puts("Doing basic bit tests...");
     37 	capng_clear(CAPNG_SELECT_BOTH);
     38 	if (capng_have_capabilities(CAPNG_SELECT_BOTH) != CAPNG_NONE) {
     39 		puts("Failed clearing capabilities");
     40 		abort();
     41 	}
     42 	saved = capng_save_state();
     43 	capng_fill(CAPNG_SELECT_BOTH);
     44 	if (capng_have_capabilities(CAPNG_SELECT_BOTH) != CAPNG_FULL) {
     45 		puts("Failed filling capabilities");
     46 		abort();
     47 	}
     48 	// Need to detect if version 1 or 2 capabilities
     49 	text = capng_print_caps_numeric(CAPNG_PRINT_BUFFER, CAPNG_SELECT_CAPS);
     50 	len = strlen(text);
     51 	free(text);
     52 	if (len < 80 && last > 30)	// The kernel & headers are mismatched
     53 		last = 30;
     54 	// Now test that restore still works
     55 	capng_restore_state(&saved);
     56 	if (capng_have_capabilities(CAPNG_SELECT_BOTH) != CAPNG_NONE) {
     57 		puts("Failed restoring capabilities");
     58 		abort();
     59 	}
     60 	printf("Doing advanced bit tests for %d capabilities...\n", last);
     61 	for (i=0; i<=last; i++) {
     62 		const char *name;
     63 		capng_clear(CAPNG_SELECT_BOTH);
     64 		rc = capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, i);
     65 		if (rc) {
     66 			puts("Failed update test 1");
     67 			abort();
     68 		}
     69 		rc = capng_have_capability(CAPNG_EFFECTIVE, i);
     70 		if (rc == 0) {
     71 			puts("Failed have capability test 1");
     72 			capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
     73 					CAPNG_SELECT_CAPS);
     74 			abort();
     75 		}
     76 		if(capng_have_capabilities(CAPNG_SELECT_CAPS)!=CAPNG_PARTIAL){
     77 			puts("Failed have capabilities test 1");
     78 			capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
     79 					CAPNG_SELECT_CAPS);
     80 			abort();
     81 		}
     82 #if CAP_LAST_CAP > 31
     83 		rc = capng_update(CAPNG_ADD, CAPNG_BOUNDING_SET, i);
     84 		if (rc) {
     85 			puts("Failed bset update test 2");
     86 			abort();
     87 		}
     88 		rc = capng_have_capability(CAPNG_BOUNDING_SET, i);
     89 		if (rc == 0) {
     90 			puts("Failed bset have capability test 2");
     91 			capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
     92 					CAPNG_SELECT_BOTH);
     93 			abort();
     94 		}
     95 		if(capng_have_capabilities(CAPNG_SELECT_BOUNDS)!=CAPNG_PARTIAL){
     96 			puts("Failed bset have capabilities test 2");
     97 			capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
     98 					CAPNG_SELECT_BOTH);
     99 			abort();
    100 		}
    101 #endif
    102 		text=capng_print_caps_text(CAPNG_PRINT_BUFFER, CAPNG_EFFECTIVE);
    103 		if (text == NULL) {
    104 			puts("Failed getting print text to buffer");
    105 			abort();
    106 		}
    107 		name = capng_capability_to_name(i);
    108 		if (name == NULL) {
    109 			printf("Failed converting capability %d to name\n", i);
    110 			abort();
    111 		}
    112 		if (strcmp(text, name)) {
    113 			puts("Failed print text comparison");
    114 			printf("%s != %s\n", text, name);
    115 			abort();
    116 		}
    117 		free(text);
    118 		// Now make sure the mask part is working
    119 		capng_fill(CAPNG_SELECT_BOTH);
    120 		rc = capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, i);
    121 		if (rc) {
    122 			puts("Failed update test 3");
    123 			abort();
    124 		}
    125 		// Should be partial
    126 		if(capng_have_capabilities(CAPNG_SELECT_CAPS)!=CAPNG_PARTIAL){
    127 			puts("Failed have capabilities test 3");
    128 			capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
    129 					CAPNG_SELECT_CAPS);
    130 			abort();
    131 		}
    132 		// Add back the bit and should be full capabilities
    133 		rc = capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, i);
    134 		if (rc) {
    135 			puts("Failed update test 4");
    136 			abort();
    137 		}
    138 		if (capng_have_capabilities(CAPNG_SELECT_CAPS) != CAPNG_FULL){
    139 			puts("Failed have capabilities test 4");
    140 			capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
    141 					CAPNG_SELECT_CAPS);
    142 			abort();
    143 		}
    144 	}
    145 	// Now test the updatev function
    146 	capng_clear(CAPNG_SELECT_BOTH);
    147 	rc = capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE,
    148 			CAP_CHOWN, CAP_FOWNER, CAP_KILL, -1);
    149 	if (rc) {
    150 		puts("Failed updatev test");
    151 		abort();
    152 	}
    153 	rc = capng_have_capability(CAPNG_EFFECTIVE, CAP_CHOWN) &&
    154 		capng_have_capability(CAPNG_EFFECTIVE, CAP_FOWNER) &&
    155 		capng_have_capability(CAPNG_EFFECTIVE, CAP_KILL);
    156 	if (rc == 0) {
    157 		puts("Failed have updatev capability test");
    158 		capng_print_caps_numeric(CAPNG_PRINT_STDOUT,
    159 				CAPNG_SELECT_CAPS);
    160 		abort();
    161 	}
    162 
    163 	return EXIT_SUCCESS;
    164 }
    165 
    166