Coverage Report

Created: 2026-10-19 06:39

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 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
}