/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 default_selinux_audit(void *ptr __attribute__((unused)), |
28 | | security_class_t cls __attribute__((unused)), |
29 | | char *buf __attribute__((unused)), |
30 | | size_t len __attribute__((unused))) |
31 | 0 | { |
32 | 0 | return 0; |
33 | 0 | } |
34 | | |
35 | | static int default_selinux_validate(char **ctx) |
36 | 0 | { |
37 | 0 | #ifndef BUILD_HOST |
38 | 0 | return security_check_context(*ctx); |
39 | | #else |
40 | | (void)ctx; |
41 | | return 0; |
42 | | #endif |
43 | 0 | } |
44 | | |
45 | | static int default_selinux_setenforce(int enforcing __attribute__((unused))) |
46 | 0 | { |
47 | 0 | return 0; |
48 | 0 | } |
49 | | |
50 | | static int default_selinux_policyload(int seqno __attribute__((unused))) |
51 | 0 | { |
52 | 0 | return 0; |
53 | 0 | } |
54 | | |
55 | | /* callback pointers */ |
56 | | int __attribute__((format(printf, 2, |
57 | | 3))) (*selinux_log_direct)(int, const char *, |
58 | | ...) = default_selinux_log; |
59 | | |
60 | | int (*selinux_audit)(void *, security_class_t, char *, |
61 | | size_t) = default_selinux_audit; |
62 | | |
63 | | int (*selinux_validate)(char **ctx) = default_selinux_validate; |
64 | | |
65 | | int (*selinux_netlink_setenforce)(int enforcing) = default_selinux_setenforce; |
66 | | |
67 | | int (*selinux_netlink_policyload)(int seqno) = default_selinux_policyload; |
68 | | |
69 | | /* callback setting function */ |
70 | | void selinux_set_callback(int type, union selinux_callback cb) |
71 | 17.8k | { |
72 | 17.8k | switch (type) { |
73 | 8.93k | case SELINUX_CB_LOG: |
74 | 8.93k | selinux_log_direct = cb.func_log; |
75 | 8.93k | break; |
76 | 0 | case SELINUX_CB_AUDIT: |
77 | 0 | selinux_audit = cb.func_audit; |
78 | 0 | break; |
79 | 8.93k | case SELINUX_CB_VALIDATE: |
80 | 8.93k | selinux_validate = cb.func_validate; |
81 | 8.93k | break; |
82 | 0 | case SELINUX_CB_SETENFORCE: |
83 | 0 | selinux_netlink_setenforce = cb.func_setenforce; |
84 | 0 | break; |
85 | 0 | case SELINUX_CB_POLICYLOAD: |
86 | 0 | selinux_netlink_policyload = cb.func_policyload; |
87 | 0 | break; |
88 | 17.8k | } |
89 | 17.8k | } |
90 | | |
91 | | /* callback getting function */ |
92 | | union selinux_callback selinux_get_callback(int type) |
93 | 0 | { |
94 | 0 | union selinux_callback cb; |
95 | |
|
96 | 0 | switch (type) { |
97 | 0 | case SELINUX_CB_LOG: |
98 | 0 | cb.func_log = selinux_log_direct; |
99 | 0 | break; |
100 | 0 | case SELINUX_CB_AUDIT: |
101 | 0 | cb.func_audit = selinux_audit; |
102 | 0 | break; |
103 | 0 | case SELINUX_CB_VALIDATE: |
104 | 0 | cb.func_validate = selinux_validate; |
105 | 0 | break; |
106 | 0 | case SELINUX_CB_SETENFORCE: |
107 | 0 | cb.func_setenforce = selinux_netlink_setenforce; |
108 | 0 | break; |
109 | 0 | case SELINUX_CB_POLICYLOAD: |
110 | 0 | cb.func_policyload = selinux_netlink_policyload; |
111 | 0 | break; |
112 | 0 | default: |
113 | 0 | memset(&cb, 0, sizeof(cb)); |
114 | 0 | errno = EINVAL; |
115 | 0 | break; |
116 | 0 | } |
117 | 0 | return cb; |
118 | 0 | } |