1 //===-- selinux.c ---------------------------------------------------------===//
2 //
3 //                     The KLEE Symbolic Virtual Machine
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 /* Very basic SELinux support */
11 
12 #include "klee/Config/config.h"
13 
14 #ifdef HAVE_SELINUX_SELINUX_H
15 
16 #include "klee/klee.h"
17 
18 #include <selinux/selinux.h>
19 #include <stdlib.h>
20 #include <errno.h>
21 
22 /* for now, assume we run on an SELinux machine */
23 int exe_selinux = 1;
24 
25 /* NULL is the default policy behavior */
26 KLEE_SELINUX_CTX_CONST char *create_con = NULL;
27 
28 
is_selinux_enabled()29 int is_selinux_enabled() {
30   return exe_selinux;
31 }
32 
33 
34 /***/
35 
getfscreatecon(char ** context)36 int getfscreatecon(char **context) {
37   *context = (char *)create_con;
38   return 0;
39 }
40 
41 
setfscreatecon(KLEE_SELINUX_CTX_CONST char * context)42 int setfscreatecon(KLEE_SELINUX_CTX_CONST char *context) {
43   if (context == NULL) {
44     create_con = context;
45     return 0;
46   }
47 
48   /* on my machine, setfscreatecon seems to incorrectly accept one
49      char strings.. Also, make sure mcstrans > 0.2.8 for replay
50      (important bug fixed) */
51   if (context[0] != '\0' && context[1] == '\0')
52     klee_silent_exit(1);
53 
54   return -1;
55 }
56 
57 /***/
58 
setfilecon(const char * path,KLEE_SELINUX_CTX_CONST char * con)59 int setfilecon(const char *path, KLEE_SELINUX_CTX_CONST char *con) {
60   if (con)
61     return 0;
62 
63   errno = ENOSPC;
64   return -1;
65 }
66 
lsetfilecon(const char * path,KLEE_SELINUX_CTX_CONST char * con)67 int lsetfilecon(const char *path, KLEE_SELINUX_CTX_CONST char *con) {
68   return setfilecon(path, con);
69 }
70 
fsetfilecon(int fd,KLEE_SELINUX_CTX_CONST char * con)71 int fsetfilecon(int fd, KLEE_SELINUX_CTX_CONST char *con) {
72   return setfilecon("", con);
73 }
74 
75 /***/
76 
freecon(char * con)77 void freecon(char *con) {}
freeconary(char ** con)78 void freeconary(char **con) {}
79 
80 #endif
81