xref: /aosp_15_r20/external/toybox/lib/lsm.h (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* lsm.h - header file for lib directory
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2015 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker  */
5*cf5a6c84SAndroid Build Coastguard Worker 
6*cf5a6c84SAndroid Build Coastguard Worker #if CFG_TOYBOX_SELINUX
7*cf5a6c84SAndroid Build Coastguard Worker #include <selinux/selinux.h>
8*cf5a6c84SAndroid Build Coastguard Worker #else
9*cf5a6c84SAndroid Build Coastguard Worker #define is_selinux_enabled() 0
10*cf5a6c84SAndroid Build Coastguard Worker #define setfscreatecon(...) (-1)
11*cf5a6c84SAndroid Build Coastguard Worker #define getcon(...) (-1)
12*cf5a6c84SAndroid Build Coastguard Worker #define getfilecon(...) (-1)
13*cf5a6c84SAndroid Build Coastguard Worker #define lgetfilecon(...) (-1)
14*cf5a6c84SAndroid Build Coastguard Worker #define fgetfilecon(...) (-1)
15*cf5a6c84SAndroid Build Coastguard Worker #define setfilecon(...) (-1)
16*cf5a6c84SAndroid Build Coastguard Worker #define lsetfilecon(...) (-1)
17*cf5a6c84SAndroid Build Coastguard Worker #define fsetfilecon(...) (-1)
18*cf5a6c84SAndroid Build Coastguard Worker #endif
19*cf5a6c84SAndroid Build Coastguard Worker 
20*cf5a6c84SAndroid Build Coastguard Worker #if CFG_TOYBOX_SMACK
21*cf5a6c84SAndroid Build Coastguard Worker #include <sys/smack.h>
22*cf5a6c84SAndroid Build Coastguard Worker #include <linux/xattr.h>
23*cf5a6c84SAndroid Build Coastguard Worker #else
24*cf5a6c84SAndroid Build Coastguard Worker #ifndef XATTR_NAME_SMACK
25*cf5a6c84SAndroid Build Coastguard Worker #define XATTR_NAME_SMACK 0
26*cf5a6c84SAndroid Build Coastguard Worker #endif
27*cf5a6c84SAndroid Build Coastguard Worker #define smack_smackfs_path(...) (-1)
28*cf5a6c84SAndroid Build Coastguard Worker #define smack_new_label_from_self(...) (-1)
29*cf5a6c84SAndroid Build Coastguard Worker #define smack_new_label_from_path(...) (-1)
30*cf5a6c84SAndroid Build Coastguard Worker #define smack_new_label_from_file(...) (-1)
31*cf5a6c84SAndroid Build Coastguard Worker #define smack_set_label_for_self(...) (-1)
32*cf5a6c84SAndroid Build Coastguard Worker #define smack_set_label_for_path(...) (-1)
33*cf5a6c84SAndroid Build Coastguard Worker #define smack_set_label_for_file(...) (-1)
34*cf5a6c84SAndroid Build Coastguard Worker #endif
35*cf5a6c84SAndroid Build Coastguard Worker 
36*cf5a6c84SAndroid Build Coastguard Worker // This turns into "return 0" when no LSM and lets code optimize out.
lsm_enabled(void)37*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_enabled(void)
38*cf5a6c84SAndroid Build Coastguard Worker {
39*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK) return !!smack_smackfs_path();
40*cf5a6c84SAndroid Build Coastguard Worker   else return is_selinux_enabled() == 1;
41*cf5a6c84SAndroid Build Coastguard Worker }
42*cf5a6c84SAndroid Build Coastguard Worker 
lsm_name(void)43*cf5a6c84SAndroid Build Coastguard Worker static inline char *lsm_name(void)
44*cf5a6c84SAndroid Build Coastguard Worker {
45*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK) return "Smack";
46*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SELINUX) return "SELinux";
47*cf5a6c84SAndroid Build Coastguard Worker 
48*cf5a6c84SAndroid Build Coastguard Worker   return "LSM";
49*cf5a6c84SAndroid Build Coastguard Worker }
50*cf5a6c84SAndroid Build Coastguard Worker 
51*cf5a6c84SAndroid Build Coastguard Worker // Fetch this process's lsm context
lsm_context(void)52*cf5a6c84SAndroid Build Coastguard Worker static inline char *lsm_context(void)
53*cf5a6c84SAndroid Build Coastguard Worker {
54*cf5a6c84SAndroid Build Coastguard Worker   int ok = 0;
55*cf5a6c84SAndroid Build Coastguard Worker   char *result = 0;
56*cf5a6c84SAndroid Build Coastguard Worker 
57*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK) ok = smack_new_label_from_self(&result) > 0;
58*cf5a6c84SAndroid Build Coastguard Worker   else ok = getcon(&result) == 0;
59*cf5a6c84SAndroid Build Coastguard Worker 
60*cf5a6c84SAndroid Build Coastguard Worker   return ok ? result : strdup("?");
61*cf5a6c84SAndroid Build Coastguard Worker }
62*cf5a6c84SAndroid Build Coastguard Worker 
63*cf5a6c84SAndroid Build Coastguard Worker // Set default label to apply to newly created stuff (NULL to clear it)
lsm_set_create(char * context)64*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_set_create(char *context)
65*cf5a6c84SAndroid Build Coastguard Worker {
66*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK) return smack_set_label_for_self(context);
67*cf5a6c84SAndroid Build Coastguard Worker   else return setfscreatecon(context);
68*cf5a6c84SAndroid Build Coastguard Worker }
69*cf5a6c84SAndroid Build Coastguard Worker 
70*cf5a6c84SAndroid Build Coastguard Worker // Label a file, following symlinks
lsm_set_context(char * filename,char * context)71*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_set_context(char *filename, char *context)
72*cf5a6c84SAndroid Build Coastguard Worker {
73*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK)
74*cf5a6c84SAndroid Build Coastguard Worker     return smack_set_label_for_path(filename, XATTR_NAME_SMACK, 1, context);
75*cf5a6c84SAndroid Build Coastguard Worker   else return setfilecon(filename, context);
76*cf5a6c84SAndroid Build Coastguard Worker }
77*cf5a6c84SAndroid Build Coastguard Worker 
78*cf5a6c84SAndroid Build Coastguard Worker // Label a file, don't follow symlinks
lsm_lset_context(char * filename,char * context)79*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_lset_context(char *filename, char *context)
80*cf5a6c84SAndroid Build Coastguard Worker {
81*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK)
82*cf5a6c84SAndroid Build Coastguard Worker     return smack_set_label_for_path(filename, XATTR_NAME_SMACK, 0, context);
83*cf5a6c84SAndroid Build Coastguard Worker   else return lsetfilecon(filename, context);
84*cf5a6c84SAndroid Build Coastguard Worker }
85*cf5a6c84SAndroid Build Coastguard Worker 
86*cf5a6c84SAndroid Build Coastguard Worker // Label a file by filehandle
lsm_fset_context(int file,char * context)87*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_fset_context(int file, char *context)
88*cf5a6c84SAndroid Build Coastguard Worker {
89*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK)
90*cf5a6c84SAndroid Build Coastguard Worker     return smack_set_label_for_file(file, XATTR_NAME_SMACK, context);
91*cf5a6c84SAndroid Build Coastguard Worker   else return fsetfilecon(file, context);
92*cf5a6c84SAndroid Build Coastguard Worker }
93*cf5a6c84SAndroid Build Coastguard Worker 
94*cf5a6c84SAndroid Build Coastguard Worker // returns -1 in case of error or else the length of the context */
95*cf5a6c84SAndroid Build Coastguard Worker // context can be NULL to get the length only */
lsm_get_context(char * filename,char ** context)96*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_get_context(char *filename, char **context)
97*cf5a6c84SAndroid Build Coastguard Worker {
98*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK)
99*cf5a6c84SAndroid Build Coastguard Worker     return smack_new_label_from_path(filename, XATTR_NAME_SMACK, 1, context);
100*cf5a6c84SAndroid Build Coastguard Worker   else return getfilecon(filename, context);
101*cf5a6c84SAndroid Build Coastguard Worker }
102*cf5a6c84SAndroid Build Coastguard Worker 
lsm_lget_context(char * filename,char ** context)103*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_lget_context(char *filename, char **context)
104*cf5a6c84SAndroid Build Coastguard Worker {
105*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK)
106*cf5a6c84SAndroid Build Coastguard Worker     return smack_new_label_from_path(filename, XATTR_NAME_SMACK, 0, context);
107*cf5a6c84SAndroid Build Coastguard Worker   else return lgetfilecon(filename, context);
108*cf5a6c84SAndroid Build Coastguard Worker }
109*cf5a6c84SAndroid Build Coastguard Worker 
lsm_fget_context(int file,char ** context)110*cf5a6c84SAndroid Build Coastguard Worker static inline int lsm_fget_context(int file, char **context)
111*cf5a6c84SAndroid Build Coastguard Worker {
112*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_SMACK)
113*cf5a6c84SAndroid Build Coastguard Worker     return smack_new_label_from_file(file, XATTR_NAME_SMACK, context);
114*cf5a6c84SAndroid Build Coastguard Worker   return fgetfilecon(file, context);
115*cf5a6c84SAndroid Build Coastguard Worker }
116