Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
2ccf4661
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
2ccf4661
编写于
7月 19, 2014
作者:
J
James Morris
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'next' of
git://git.infradead.org/users/pcmoore/selinux
into next
上级
32c2e675
615e51fd
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
102 addition
and
162 deletion
+102
-162
scripts/selinux/genheaders/Makefile
scripts/selinux/genheaders/Makefile
+0
-1
scripts/selinux/mdp/Makefile
scripts/selinux/mdp/Makefile
+1
-1
security/selinux/hooks.c
security/selinux/hooks.c
+14
-0
security/selinux/include/netif.h
security/selinux/include/netif.h
+2
-0
security/selinux/include/netnode.h
security/selinux/include/netnode.h
+2
-0
security/selinux/include/netport.h
security/selinux/include/netport.h
+2
-0
security/selinux/include/security.h
security/selinux/include/security.h
+2
-1
security/selinux/netif.c
security/selinux/netif.c
+1
-14
security/selinux/netnode.c
security/selinux/netnode.c
+1
-14
security/selinux/netport.c
security/selinux/netport.c
+1
-14
security/selinux/ss/conditional.c
security/selinux/ss/conditional.c
+3
-8
security/selinux/ss/policydb.c
security/selinux/ss/policydb.c
+41
-100
security/selinux/ss/services.c
security/selinux/ss/services.c
+32
-9
未找到文件。
scripts/selinux/genheaders/Makefile
浏览文件 @
2ccf4661
...
...
@@ -2,4 +2,3 @@ hostprogs-y := genheaders
HOST_EXTRACFLAGS
+=
-Isecurity
/selinux/include
always
:=
$
(
hostprogs-y
)
clean-files
:=
$
(
hostprogs-y
)
scripts/selinux/mdp/Makefile
浏览文件 @
2ccf4661
...
...
@@ -2,4 +2,4 @@ hostprogs-y := mdp
HOST_EXTRACFLAGS
+=
-Isecurity
/selinux/include
always
:=
$
(
hostprogs-y
)
clean-files
:=
$
(
hostprogs-y
)
policy.
*
file_contexts
clean-files
:=
policy.
*
file_contexts
security/selinux/hooks.c
浏览文件 @
2ccf4661
...
...
@@ -161,6 +161,17 @@ static int selinux_peerlbl_enabled(void)
return
(
selinux_policycap_alwaysnetwork
||
netlbl_enabled
()
||
selinux_xfrm_enabled
());
}
static
int
selinux_netcache_avc_callback
(
u32
event
)
{
if
(
event
==
AVC_CALLBACK_RESET
)
{
sel_netif_flush
();
sel_netnode_flush
();
sel_netport_flush
();
synchronize_net
();
}
return
0
;
}
/*
* initialise the security for the init task
*/
...
...
@@ -6002,6 +6013,9 @@ static __init int selinux_init(void)
if
(
register_security
(
&
selinux_ops
))
panic
(
"SELinux: Unable to register with kernel.
\n
"
);
if
(
avc_add_callback
(
selinux_netcache_avc_callback
,
AVC_CALLBACK_RESET
))
panic
(
"SELinux: Unable to register AVC netcache callback
\n
"
);
if
(
selinux_enforcing
)
printk
(
KERN_DEBUG
"SELinux: Starting in enforcing mode
\n
"
);
else
...
...
security/selinux/include/netif.h
浏览文件 @
2ccf4661
...
...
@@ -17,6 +17,8 @@
#ifndef _SELINUX_NETIF_H_
#define _SELINUX_NETIF_H_
void
sel_netif_flush
(
void
);
int
sel_netif_sid
(
int
ifindex
,
u32
*
sid
);
#endif
/* _SELINUX_NETIF_H_ */
...
...
security/selinux/include/netnode.h
浏览文件 @
2ccf4661
...
...
@@ -27,6 +27,8 @@
#ifndef _SELINUX_NETNODE_H
#define _SELINUX_NETNODE_H
void
sel_netnode_flush
(
void
);
int
sel_netnode_sid
(
void
*
addr
,
u16
family
,
u32
*
sid
);
#endif
security/selinux/include/netport.h
浏览文件 @
2ccf4661
...
...
@@ -26,6 +26,8 @@
#ifndef _SELINUX_NETPORT_H
#define _SELINUX_NETPORT_H
void
sel_netport_flush
(
void
);
int
sel_netport_sid
(
u8
protocol
,
u16
pnum
,
u32
*
sid
);
#endif
security/selinux/include/security.h
浏览文件 @
2ccf4661
...
...
@@ -8,6 +8,7 @@
#ifndef _SELINUX_SECURITY_H_
#define _SELINUX_SECURITY_H_
#include <linux/compiler.h>
#include <linux/dcache.h>
#include <linux/magic.h>
#include <linux/types.h>
...
...
@@ -220,7 +221,7 @@ struct selinux_kernel_status {
/*
* The version > 0 supports above members.
*/
}
__
attribute__
((
packed
))
;
}
__
packed
;
extern
void
selinux_status_update_setenforce
(
int
enforcing
);
extern
void
selinux_status_update_policyload
(
int
seqno
);
...
...
security/selinux/netif.c
浏览文件 @
2ccf4661
...
...
@@ -240,7 +240,7 @@ static void sel_netif_kill(int ifindex)
* Remove all entries from the network interface table.
*
*/
static
void
sel_netif_flush
(
void
)
void
sel_netif_flush
(
void
)
{
int
idx
;
struct
sel_netif
*
netif
;
...
...
@@ -252,15 +252,6 @@ static void sel_netif_flush(void)
spin_unlock_bh
(
&
sel_netif_lock
);
}
static
int
sel_netif_avc_callback
(
u32
event
)
{
if
(
event
==
AVC_CALLBACK_RESET
)
{
sel_netif_flush
();
synchronize_net
();
}
return
0
;
}
static
int
sel_netif_netdev_notifier_handler
(
struct
notifier_block
*
this
,
unsigned
long
event
,
void
*
ptr
)
{
...
...
@@ -291,10 +282,6 @@ static __init int sel_netif_init(void)
register_netdevice_notifier
(
&
sel_netif_netdev_notifier
);
err
=
avc_add_callback
(
sel_netif_avc_callback
,
AVC_CALLBACK_RESET
);
if
(
err
)
panic
(
"avc_add_callback() failed, error %d
\n
"
,
err
);
return
err
;
}
...
...
security/selinux/netnode.c
浏览文件 @
2ccf4661
...
...
@@ -283,7 +283,7 @@ int sel_netnode_sid(void *addr, u16 family, u32 *sid)
* Remove all entries from the network address table.
*
*/
static
void
sel_netnode_flush
(
void
)
void
sel_netnode_flush
(
void
)
{
unsigned
int
idx
;
struct
sel_netnode
*
node
,
*
node_tmp
;
...
...
@@ -300,15 +300,6 @@ static void sel_netnode_flush(void)
spin_unlock_bh
(
&
sel_netnode_lock
);
}
static
int
sel_netnode_avc_callback
(
u32
event
)
{
if
(
event
==
AVC_CALLBACK_RESET
)
{
sel_netnode_flush
();
synchronize_net
();
}
return
0
;
}
static
__init
int
sel_netnode_init
(
void
)
{
int
iter
;
...
...
@@ -322,10 +313,6 @@ static __init int sel_netnode_init(void)
sel_netnode_hash
[
iter
].
size
=
0
;
}
ret
=
avc_add_callback
(
sel_netnode_avc_callback
,
AVC_CALLBACK_RESET
);
if
(
ret
!=
0
)
panic
(
"avc_add_callback() failed, error %d
\n
"
,
ret
);
return
ret
;
}
...
...
security/selinux/netport.c
浏览文件 @
2ccf4661
...
...
@@ -217,7 +217,7 @@ int sel_netport_sid(u8 protocol, u16 pnum, u32 *sid)
* Remove all entries from the network address table.
*
*/
static
void
sel_netport_flush
(
void
)
void
sel_netport_flush
(
void
)
{
unsigned
int
idx
;
struct
sel_netport
*
port
,
*
port_tmp
;
...
...
@@ -234,15 +234,6 @@ static void sel_netport_flush(void)
spin_unlock_bh
(
&
sel_netport_lock
);
}
static
int
sel_netport_avc_callback
(
u32
event
)
{
if
(
event
==
AVC_CALLBACK_RESET
)
{
sel_netport_flush
();
synchronize_net
();
}
return
0
;
}
static
__init
int
sel_netport_init
(
void
)
{
int
iter
;
...
...
@@ -256,10 +247,6 @@ static __init int sel_netport_init(void)
sel_netport_hash
[
iter
].
size
=
0
;
}
ret
=
avc_add_callback
(
sel_netport_avc_callback
,
AVC_CALLBACK_RESET
);
if
(
ret
!=
0
)
panic
(
"avc_add_callback() failed, error %d
\n
"
,
ret
);
return
ret
;
}
...
...
security/selinux/ss/conditional.c
浏览文件 @
2ccf4661
...
...
@@ -402,19 +402,14 @@ static int cond_read_node(struct policydb *p, struct cond_node *node, void *fp)
int
rc
;
struct
cond_expr
*
expr
=
NULL
,
*
last
=
NULL
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
));
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
)
*
2
);
if
(
rc
)
return
rc
;
goto
err
;
node
->
cur_state
=
le32_to_cpu
(
buf
[
0
]);
len
=
0
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
));
if
(
rc
)
return
rc
;
/* expr */
len
=
le32_to_cpu
(
buf
[
0
]);
len
=
le32_to_cpu
(
buf
[
1
]);
for
(
i
=
0
;
i
<
len
;
i
++
)
{
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
)
*
2
);
...
...
security/selinux/ss/policydb.c
浏览文件 @
2ccf4661
...
...
@@ -1080,6 +1080,26 @@ static int context_read_and_validate(struct context *c,
* binary representation file.
*/
static
int
str_read
(
char
**
strp
,
gfp_t
flags
,
void
*
fp
,
u32
len
)
{
int
rc
;
char
*
str
;
str
=
kmalloc
(
len
+
1
,
flags
);
if
(
!
str
)
return
-
ENOMEM
;
/* it's expected the caller should free the str */
*
strp
=
str
;
rc
=
next_entry
(
str
,
fp
,
len
);
if
(
rc
)
return
rc
;
str
[
len
]
=
'\0'
;
return
0
;
}
static
int
perm_read
(
struct
policydb
*
p
,
struct
hashtab
*
h
,
void
*
fp
)
{
char
*
key
=
NULL
;
...
...
@@ -1100,15 +1120,9 @@ static int perm_read(struct policydb *p, struct hashtab *h, void *fp)
len
=
le32_to_cpu
(
buf
[
0
]);
perdatum
->
value
=
le32_to_cpu
(
buf
[
1
]);
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
rc
=
hashtab_insert
(
h
,
key
,
perdatum
);
if
(
rc
)
...
...
@@ -1146,15 +1160,9 @@ static int common_read(struct policydb *p, struct hashtab *h, void *fp)
comdatum
->
permissions
.
nprim
=
le32_to_cpu
(
buf
[
2
]);
nel
=
le32_to_cpu
(
buf
[
3
]);
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
for
(
i
=
0
;
i
<
nel
;
i
++
)
{
rc
=
perm_read
(
p
,
comdatum
->
permissions
.
table
,
fp
);
...
...
@@ -1321,25 +1329,14 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp)
ncons
=
le32_to_cpu
(
buf
[
5
]);
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
if
(
len2
)
{
rc
=
-
ENOMEM
;
cladatum
->
comkey
=
kmalloc
(
len2
+
1
,
GFP_KERNEL
);
if
(
!
cladatum
->
comkey
)
goto
bad
;
rc
=
next_entry
(
cladatum
->
comkey
,
fp
,
len2
);
rc
=
str_read
(
&
cladatum
->
comkey
,
GFP_KERNEL
,
fp
,
len2
);
if
(
rc
)
goto
bad
;
cladatum
->
comkey
[
len2
]
=
'\0'
;
rc
=
-
EINVAL
;
cladatum
->
comdatum
=
hashtab_search
(
p
->
p_commons
.
table
,
cladatum
->
comkey
);
...
...
@@ -1422,15 +1419,9 @@ static int role_read(struct policydb *p, struct hashtab *h, void *fp)
if
(
p
->
policyvers
>=
POLICYDB_VERSION_BOUNDARY
)
role
->
bounds
=
le32_to_cpu
(
buf
[
2
]);
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
rc
=
ebitmap_read
(
&
role
->
dominates
,
fp
);
if
(
rc
)
...
...
@@ -1495,14 +1486,9 @@ static int type_read(struct policydb *p, struct hashtab *h, void *fp)
typdatum
->
primary
=
le32_to_cpu
(
buf
[
2
]);
}
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
rc
=
hashtab_insert
(
h
,
key
,
typdatum
);
if
(
rc
)
...
...
@@ -1565,14 +1551,9 @@ static int user_read(struct policydb *p, struct hashtab *h, void *fp)
if
(
p
->
policyvers
>=
POLICYDB_VERSION_BOUNDARY
)
usrdatum
->
bounds
=
le32_to_cpu
(
buf
[
2
]);
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
rc
=
ebitmap_read
(
&
usrdatum
->
roles
,
fp
);
if
(
rc
)
...
...
@@ -1616,14 +1597,9 @@ static int sens_read(struct policydb *p, struct hashtab *h, void *fp)
len
=
le32_to_cpu
(
buf
[
0
]);
levdatum
->
isalias
=
le32_to_cpu
(
buf
[
1
]);
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_ATOMIC
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_ATOMIC
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
rc
=
-
ENOMEM
;
levdatum
->
level
=
kmalloc
(
sizeof
(
struct
mls_level
),
GFP_ATOMIC
);
...
...
@@ -1664,14 +1640,9 @@ static int cat_read(struct policydb *p, struct hashtab *h, void *fp)
catdatum
->
value
=
le32_to_cpu
(
buf
[
1
]);
catdatum
->
isalias
=
le32_to_cpu
(
buf
[
2
]);
rc
=
-
ENOMEM
;
key
=
kmalloc
(
len
+
1
,
GFP_ATOMIC
);
if
(
!
key
)
goto
bad
;
rc
=
next_entry
(
key
,
fp
,
len
);
rc
=
str_read
(
&
key
,
GFP_ATOMIC
,
fp
,
len
);
if
(
rc
)
goto
bad
;
key
[
len
]
=
'\0'
;
rc
=
hashtab_insert
(
h
,
key
,
catdatum
);
if
(
rc
)
...
...
@@ -1968,18 +1939,12 @@ static int filename_trans_read(struct policydb *p, void *fp)
goto
out
;
len
=
le32_to_cpu
(
buf
[
0
]);
rc
=
-
ENOMEM
;
name
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
name
)
goto
out
;
ft
->
name
=
name
;
/* path component string */
rc
=
next_entry
(
name
,
fp
,
len
);
rc
=
str_read
(
&
name
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
out
;
name
[
len
]
=
0
;
ft
->
name
=
name
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
)
*
4
);
if
(
rc
)
...
...
@@ -2045,17 +2010,10 @@ static int genfs_read(struct policydb *p, void *fp)
if
(
!
newgenfs
)
goto
out
;
rc
=
-
ENOMEM
;
newgenfs
->
fstype
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
newgenfs
->
fstype
)
goto
out
;
rc
=
next_entry
(
newgenfs
->
fstype
,
fp
,
len
);
rc
=
str_read
(
&
newgenfs
->
fstype
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
out
;
newgenfs
->
fstype
[
len
]
=
0
;
for
(
genfs_p
=
NULL
,
genfs
=
p
->
genfs
;
genfs
;
genfs_p
=
genfs
,
genfs
=
genfs
->
next
)
{
rc
=
-
EINVAL
;
...
...
@@ -2091,15 +2049,9 @@ static int genfs_read(struct policydb *p, void *fp)
if
(
!
newc
)
goto
out
;
rc
=
-
ENOMEM
;
newc
->
u
.
name
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
newc
->
u
.
name
)
goto
out
;
rc
=
next_entry
(
newc
->
u
.
name
,
fp
,
len
);
rc
=
str_read
(
&
newc
->
u
.
name
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
out
;
newc
->
u
.
name
[
len
]
=
0
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
));
if
(
rc
)
...
...
@@ -2189,16 +2141,10 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
goto
out
;
len
=
le32_to_cpu
(
buf
[
0
]);
rc
=
-
ENOMEM
;
c
->
u
.
name
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
c
->
u
.
name
)
goto
out
;
rc
=
next_entry
(
c
->
u
.
name
,
fp
,
len
);
rc
=
str_read
(
&
c
->
u
.
name
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
out
;
c
->
u
.
name
[
len
]
=
0
;
rc
=
context_read_and_validate
(
&
c
->
context
[
0
],
p
,
fp
);
if
(
rc
)
goto
out
;
...
...
@@ -2240,16 +2186,11 @@ static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
if
(
c
->
v
.
behavior
>
SECURITY_FS_USE_MAX
)
goto
out
;
rc
=
-
ENOMEM
;
len
=
le32_to_cpu
(
buf
[
1
]);
c
->
u
.
name
=
kmalloc
(
len
+
1
,
GFP_KERNEL
);
if
(
!
c
->
u
.
name
)
goto
out
;
rc
=
next_entry
(
c
->
u
.
name
,
fp
,
len
);
rc
=
str_read
(
&
c
->
u
.
name
,
GFP_KERNEL
,
fp
,
len
);
if
(
rc
)
goto
out
;
c
->
u
.
name
[
len
]
=
0
;
rc
=
context_read_and_validate
(
&
c
->
context
[
0
],
p
,
fp
);
if
(
rc
)
goto
out
;
...
...
@@ -2608,7 +2549,7 @@ static int mls_write_range_helper(struct mls_range *r, void *fp)
if
(
!
eq
)
buf
[
2
]
=
cpu_to_le32
(
r
->
level
[
1
].
sens
);
BUG_ON
(
items
>
(
sizeof
(
buf
)
/
sizeof
(
buf
[
0
])
));
BUG_ON
(
items
>
ARRAY_SIZE
(
buf
));
rc
=
put_entry
(
buf
,
sizeof
(
u32
),
items
,
fp
);
if
(
rc
)
...
...
@@ -2990,7 +2931,7 @@ static int role_write(void *vkey, void *datum, void *ptr)
if
(
p
->
policyvers
>=
POLICYDB_VERSION_BOUNDARY
)
buf
[
items
++
]
=
cpu_to_le32
(
role
->
bounds
);
BUG_ON
(
items
>
(
sizeof
(
buf
)
/
sizeof
(
buf
[
0
])
));
BUG_ON
(
items
>
ARRAY_SIZE
(
buf
));
rc
=
put_entry
(
buf
,
sizeof
(
u32
),
items
,
fp
);
if
(
rc
)
...
...
@@ -3040,7 +2981,7 @@ static int type_write(void *vkey, void *datum, void *ptr)
}
else
{
buf
[
items
++
]
=
cpu_to_le32
(
typdatum
->
primary
);
}
BUG_ON
(
items
>
(
sizeof
(
buf
)
/
sizeof
(
buf
[
0
])
));
BUG_ON
(
items
>
ARRAY_SIZE
(
buf
));
rc
=
put_entry
(
buf
,
sizeof
(
u32
),
items
,
fp
);
if
(
rc
)
return
rc
;
...
...
@@ -3069,7 +3010,7 @@ static int user_write(void *vkey, void *datum, void *ptr)
buf
[
items
++
]
=
cpu_to_le32
(
usrdatum
->
value
);
if
(
p
->
policyvers
>=
POLICYDB_VERSION_BOUNDARY
)
buf
[
items
++
]
=
cpu_to_le32
(
usrdatum
->
bounds
);
BUG_ON
(
items
>
(
sizeof
(
buf
)
/
sizeof
(
buf
[
0
])
));
BUG_ON
(
items
>
ARRAY_SIZE
(
buf
));
rc
=
put_entry
(
buf
,
sizeof
(
u32
),
items
,
fp
);
if
(
rc
)
return
rc
;
...
...
security/selinux/ss/services.c
浏览文件 @
2ccf4661
...
...
@@ -2277,7 +2277,7 @@ int security_get_user_sids(u32 fromsid,
}
/**
*
security_genfs_sid - O
btain a SID for a file in a filesystem
*
__security_genfs_sid - Helper to o
btain a SID for a file in a filesystem
* @fstype: filesystem type
* @path: path from root of mount
* @sclass: file security class
...
...
@@ -2286,11 +2286,13 @@ int security_get_user_sids(u32 fromsid,
* Obtain a SID to use for a file in a filesystem that
* cannot support xattr or use a fixed labeling behavior like
* transition SIDs or task SIDs.
*
* The caller must acquire the policy_rwlock before calling this function.
*/
int
security_genfs_sid
(
const
char
*
fstype
,
char
*
path
,
u16
orig_sclass
,
u32
*
sid
)
static
inline
int
__
security_genfs_sid
(
const
char
*
fstype
,
char
*
path
,
u16
orig_sclass
,
u32
*
sid
)
{
int
len
;
u16
sclass
;
...
...
@@ -2301,8 +2303,6 @@ int security_genfs_sid(const char *fstype,
while
(
path
[
0
]
==
'/'
&&
path
[
1
]
==
'/'
)
path
++
;
read_lock
(
&
policy_rwlock
);
sclass
=
unmap_class
(
orig_sclass
);
*
sid
=
SECINITSID_UNLABELED
;
...
...
@@ -2336,10 +2336,32 @@ int security_genfs_sid(const char *fstype,
*
sid
=
c
->
sid
[
0
];
rc
=
0
;
out:
read_unlock
(
&
policy_rwlock
);
return
rc
;
}
/**
* security_genfs_sid - Obtain a SID for a file in a filesystem
* @fstype: filesystem type
* @path: path from root of mount
* @sclass: file security class
* @sid: SID for path
*
* Acquire policy_rwlock before calling __security_genfs_sid() and release
* it afterward.
*/
int
security_genfs_sid
(
const
char
*
fstype
,
char
*
path
,
u16
orig_sclass
,
u32
*
sid
)
{
int
retval
;
read_lock
(
&
policy_rwlock
);
retval
=
__security_genfs_sid
(
fstype
,
path
,
orig_sclass
,
sid
);
read_unlock
(
&
policy_rwlock
);
return
retval
;
}
/**
* security_fs_use - Determine how to handle labeling for a filesystem.
* @sb: superblock in question
...
...
@@ -2370,7 +2392,8 @@ int security_fs_use(struct super_block *sb)
}
sbsec
->
sid
=
c
->
sid
[
0
];
}
else
{
rc
=
security_genfs_sid
(
fstype
,
"/"
,
SECCLASS_DIR
,
&
sbsec
->
sid
);
rc
=
__security_genfs_sid
(
fstype
,
"/"
,
SECCLASS_DIR
,
&
sbsec
->
sid
);
if
(
rc
)
{
sbsec
->
behavior
=
SECURITY_FS_USE_NONE
;
rc
=
0
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录