/src/selinux/libselinux/src/callbacks.c
Line | Count | Source |
1 | | /* |
2 | | * User-supplied callbacks and default implementations. |
3 | | * Class and permission mappings. |
4 | | */ |
5 | | |
6 | | #include <stdio.h> |
7 | | #include <stdlib.h> |
8 | | #include <stdarg.h> |
9 | | #include <errno.h> |
10 | | #include <selinux/selinux.h> |
11 | | #include "callbacks.h" |
12 | | |
13 | | pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER; |
14 | | |
15 | | /* default implementations */ |
16 | | static int __attribute__ ((format(printf, 2, 3))) |
17 | | default_selinux_log(int type __attribute__((unused)), const char *fmt, ...) |
18 | 0 | { |
19 | 0 | int rc; |
20 | 0 | va_list ap; |
21 | 0 | va_start(ap, fmt); |
22 | 0 | rc = vfprintf(stderr, fmt, ap); |
23 | 0 | va_end(ap); |
24 | 0 | return rc; |
25 | 0 | } |
26 | | |
27 | | static int |
28 | | default_selinux_audit(void *ptr __attribute__((unused)), |
29 | | security_class_t cls __attribute__((unused)), |
30 | | char *buf __attribute__((unused)), |
31 | | size_t len __attribute__((unused))) |
32 | 0 | { |
33 | 0 | return 0; |
34 | 0 | } |
35 | | |
36 | | static int |
37 | | default_selinux_validate(char **ctx) |
38 | 0 | { |
39 | 0 | #ifndef BUILD_HOST |
40 | 0 | return security_check_context(*ctx); |
41 | | #else |
42 | | (void) ctx; |
43 | | return 0; |
44 | | #endif |
45 | 0 | } |
46 | | |
47 | | static int |
48 | | default_selinux_setenforce(int enforcing __attribute__((unused))) |
49 | 0 | { |
50 | 0 | return 0; |
51 | 0 | } |
52 | | |
53 | | static int |
54 | | default_selinux_policyload(int seqno __attribute__((unused))) |
55 | 0 | { |
56 | 0 | return 0; |
57 | 0 | } |
58 | | |
59 | | /* callback pointers */ |
60 | | int __attribute__ ((format(printf, 2, 3))) |
61 | | (*selinux_log_direct)(int, const char *, ...) = |
62 | | default_selinux_log; |
63 | | |
64 | | int |
65 | | (*selinux_audit) (void *, security_class_t, char *, size_t) = |
66 | | default_selinux_audit; |
67 | | |
68 | | int |
69 | | (*selinux_validate)(char **ctx) = |
70 | | default_selinux_validate; |
71 | | |
72 | | int |
73 | | (*selinux_netlink_setenforce) (int enforcing) = |
74 | | default_selinux_setenforce; |
75 | | |
76 | | int |
77 | | (*selinux_netlink_policyload) (int seqno) = |
78 | | default_selinux_policyload; |
79 | | |
80 | | /* callback setting function */ |
81 | | void |
82 | | selinux_set_callback(int type, union selinux_callback cb) |
83 | 6.18k | { |
84 | 6.18k | switch (type) { |
85 | 3.09k | case SELINUX_CB_LOG: |
86 | 3.09k | selinux_log_direct = cb.func_log; |
87 | 3.09k | break; |
88 | 0 | case SELINUX_CB_AUDIT: |
89 | 0 | selinux_audit = cb.func_audit; |
90 | 0 | break; |
91 | 3.09k | case SELINUX_CB_VALIDATE: |
92 | 3.09k | selinux_validate = cb.func_validate; |
93 | 3.09k | break; |
94 | 0 | case SELINUX_CB_SETENFORCE: |
95 | 0 | selinux_netlink_setenforce = cb.func_setenforce; |
96 | 0 | break; |
97 | 0 | case SELINUX_CB_POLICYLOAD: |
98 | 0 | selinux_netlink_policyload = cb.func_policyload; |
99 | 0 | break; |
100 | 6.18k | } |
101 | 6.18k | } |
102 | | |
103 | | /* callback getting function */ |
104 | | union selinux_callback |
105 | | selinux_get_callback(int type) |
106 | 0 | { |
107 | 0 | union selinux_callback cb; |
108 | |
|
109 | 0 | switch (type) { |
110 | 0 | case SELINUX_CB_LOG: |
111 | 0 | cb.func_log = selinux_log_direct; |
112 | 0 | break; |
113 | 0 | case SELINUX_CB_AUDIT: |
114 | 0 | cb.func_audit = selinux_audit; |
115 | 0 | break; |
116 | 0 | case SELINUX_CB_VALIDATE: |
117 | 0 | cb.func_validate = selinux_validate; |
118 | 0 | break; |
119 | 0 | case SELINUX_CB_SETENFORCE: |
120 | 0 | cb.func_setenforce = selinux_netlink_setenforce; |
121 | 0 | break; |
122 | 0 | case SELINUX_CB_POLICYLOAD: |
123 | 0 | cb.func_policyload = selinux_netlink_policyload; |
124 | 0 | break; |
125 | 0 | default: |
126 | 0 | memset(&cb, 0, sizeof(cb)); |
127 | 0 | errno = EINVAL; |
128 | 0 | break; |
129 | 0 | } |
130 | 0 | return cb; |
131 | 0 | } |