Coverage Report

Created: 2025-11-24 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}