Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
fa5b5b26
Commit
fa5b5b26
authored
Apr 19, 2017
by
James Morris
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'stable-4.12' of
git://git.infradead.org/users/pcmoore/selinux
into next
parents
30a83251
cae303df
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
69 additions
and
70 deletions
+69
-70
fs/namei.c
fs/namei.c
+10
-10
scripts/selinux/genheaders/genheaders.c
scripts/selinux/genheaders/genheaders.c
+1
-0
scripts/selinux/mdp/mdp.c
scripts/selinux/mdp/mdp.c
+1
-0
security/selinux/hooks.c
security/selinux/hooks.c
+8
-0
security/selinux/nlmsgtab.c
security/selinux/nlmsgtab.c
+5
-5
security/selinux/selinuxfs.c
security/selinux/selinuxfs.c
+4
-4
security/selinux/ss/conditional.c
security/selinux/ss/conditional.c
+7
-7
security/selinux/ss/hashtab.c
security/selinux/ss/hashtab.c
+5
-5
security/selinux/ss/policydb.c
security/selinux/ss/policydb.c
+24
-35
security/selinux/ss/services.c
security/selinux/ss/services.c
+1
-1
security/selinux/ss/sidtab.c
security/selinux/ss/sidtab.c
+3
-3
No files found.
fs/namei.c
View file @
fa5b5b26
...
...
@@ -340,22 +340,14 @@ int generic_permission(struct inode *inode, int mask)
if
(
S_ISDIR
(
inode
->
i_mode
))
{
/* DACs are overridable for directories */
if
(
capable_wrt_inode_uidgid
(
inode
,
CAP_DAC_OVERRIDE
))
return
0
;
if
(
!
(
mask
&
MAY_WRITE
))
if
(
capable_wrt_inode_uidgid
(
inode
,
CAP_DAC_READ_SEARCH
))
return
0
;
return
-
EACCES
;
}
/*
* Read/write DACs are always overridable.
* Executable DACs are overridable when there is
* at least one exec bit set.
*/
if
(
!
(
mask
&
MAY_EXEC
)
||
(
inode
->
i_mode
&
S_IXUGO
))
if
(
capable_wrt_inode_uidgid
(
inode
,
CAP_DAC_OVERRIDE
))
return
0
;
return
-
EACCES
;
}
/*
* Searching includes executable on directories, else just read.
...
...
@@ -364,6 +356,14 @@ int generic_permission(struct inode *inode, int mask)
if
(
mask
==
MAY_READ
)
if
(
capable_wrt_inode_uidgid
(
inode
,
CAP_DAC_READ_SEARCH
))
return
0
;
/*
* Read/write DACs are always overridable.
* Executable DACs are overridable when there is
* at least one exec bit set.
*/
if
(
!
(
mask
&
MAY_EXEC
)
||
(
inode
->
i_mode
&
S_IXUGO
))
if
(
capable_wrt_inode_uidgid
(
inode
,
CAP_DAC_OVERRIDE
))
return
0
;
return
-
EACCES
;
}
...
...
scripts/selinux/genheaders/genheaders.c
View file @
fa5b5b26
...
...
@@ -8,6 +8,7 @@
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <sys/socket.h>
struct
security_class_mapping
{
const
char
*
name
;
...
...
scripts/selinux/mdp/mdp.c
View file @
fa5b5b26
...
...
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
static
void
usage
(
char
*
name
)
{
...
...
security/selinux/hooks.c
View file @
fa5b5b26
...
...
@@ -4367,10 +4367,18 @@ static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, in
u32
sid
,
node_perm
;
if
(
family
==
PF_INET
)
{
if
(
addrlen
<
sizeof
(
struct
sockaddr_in
))
{
err
=
-
EINVAL
;
goto
out
;
}
addr4
=
(
struct
sockaddr_in
*
)
address
;
snum
=
ntohs
(
addr4
->
sin_port
);
addrp
=
(
char
*
)
&
addr4
->
sin_addr
.
s_addr
;
}
else
{
if
(
addrlen
<
SIN6_LEN_RFC2133
)
{
err
=
-
EINVAL
;
goto
out
;
}
addr6
=
(
struct
sockaddr_in6
*
)
address
;
snum
=
ntohs
(
addr6
->
sin6_port
);
addrp
=
(
char
*
)
&
addr6
->
sin6_addr
.
s6_addr
;
...
...
security/selinux/nlmsgtab.c
View file @
fa5b5b26
...
...
@@ -28,7 +28,7 @@ struct nlmsg_perm {
u32
perm
;
};
static
struct
nlmsg_perm
nlmsg_route_perms
[]
=
static
const
struct
nlmsg_perm
nlmsg_route_perms
[]
=
{
{
RTM_NEWLINK
,
NETLINK_ROUTE_SOCKET__NLMSG_WRITE
},
{
RTM_DELLINK
,
NETLINK_ROUTE_SOCKET__NLMSG_WRITE
},
...
...
@@ -80,7 +80,7 @@ static struct nlmsg_perm nlmsg_route_perms[] =
{
RTM_GETSTATS
,
NETLINK_ROUTE_SOCKET__NLMSG_READ
},
};
static
struct
nlmsg_perm
nlmsg_tcpdiag_perms
[]
=
static
const
struct
nlmsg_perm
nlmsg_tcpdiag_perms
[]
=
{
{
TCPDIAG_GETSOCK
,
NETLINK_TCPDIAG_SOCKET__NLMSG_READ
},
{
DCCPDIAG_GETSOCK
,
NETLINK_TCPDIAG_SOCKET__NLMSG_READ
},
...
...
@@ -88,7 +88,7 @@ static struct nlmsg_perm nlmsg_tcpdiag_perms[] =
{
SOCK_DESTROY
,
NETLINK_TCPDIAG_SOCKET__NLMSG_WRITE
},
};
static
struct
nlmsg_perm
nlmsg_xfrm_perms
[]
=
static
const
struct
nlmsg_perm
nlmsg_xfrm_perms
[]
=
{
{
XFRM_MSG_NEWSA
,
NETLINK_XFRM_SOCKET__NLMSG_WRITE
},
{
XFRM_MSG_DELSA
,
NETLINK_XFRM_SOCKET__NLMSG_WRITE
},
...
...
@@ -115,7 +115,7 @@ static struct nlmsg_perm nlmsg_xfrm_perms[] =
{
XFRM_MSG_MAPPING
,
NETLINK_XFRM_SOCKET__NLMSG_READ
},
};
static
struct
nlmsg_perm
nlmsg_audit_perms
[]
=
static
const
struct
nlmsg_perm
nlmsg_audit_perms
[]
=
{
{
AUDIT_GET
,
NETLINK_AUDIT_SOCKET__NLMSG_READ
},
{
AUDIT_SET
,
NETLINK_AUDIT_SOCKET__NLMSG_WRITE
},
...
...
@@ -136,7 +136,7 @@ static struct nlmsg_perm nlmsg_audit_perms[] =
};
static
int
nlmsg_perm
(
u16
nlmsg_type
,
u32
*
perm
,
struct
nlmsg_perm
*
tab
,
size_t
tabsize
)
static
int
nlmsg_perm
(
u16
nlmsg_type
,
u32
*
perm
,
const
struct
nlmsg_perm
*
tab
,
size_t
tabsize
)
{
int
i
,
err
=
-
EINVAL
;
...
...
security/selinux/selinuxfs.c
View file @
fa5b5b26
...
...
@@ -1456,10 +1456,10 @@ static int sel_avc_stats_seq_show(struct seq_file *seq, void *v)
{
struct
avc_cache_stats
*
st
=
v
;
if
(
v
==
SEQ_START_TOKEN
)
seq_p
rintf
(
seq
,
"lookups hits misses allocations reclaims "
"
frees
\n
"
);
else
{
if
(
v
==
SEQ_START_TOKEN
)
{
seq_p
uts
(
seq
,
"lookups hits misses allocations reclaims
frees
\n
"
);
}
else
{
unsigned
int
lookups
=
st
->
lookups
;
unsigned
int
misses
=
st
->
misses
;
unsigned
int
hits
=
lookups
-
misses
;
...
...
security/selinux/ss/conditional.c
View file @
fa5b5b26
...
...
@@ -176,8 +176,9 @@ void cond_policydb_destroy(struct policydb *p)
int
cond_init_bool_indexes
(
struct
policydb
*
p
)
{
kfree
(
p
->
bool_val_to_struct
);
p
->
bool_val_to_struct
=
kmalloc
(
p
->
p_bools
.
nprim
*
sizeof
(
struct
cond_bool_datum
*
),
GFP_KERNEL
);
p
->
bool_val_to_struct
=
kmalloc_array
(
p
->
p_bools
.
nprim
,
sizeof
(
*
p
->
bool_val_to_struct
),
GFP_KERNEL
);
if
(
!
p
->
bool_val_to_struct
)
return
-
ENOMEM
;
return
0
;
...
...
@@ -226,7 +227,7 @@ int cond_read_bool(struct policydb *p, struct hashtab *h, void *fp)
u32
len
;
int
rc
;
booldatum
=
kzalloc
(
sizeof
(
struct
cond_bool_
datum
),
GFP_KERNEL
);
booldatum
=
kzalloc
(
sizeof
(
*
bool
datum
),
GFP_KERNEL
);
if
(
!
booldatum
)
return
-
ENOMEM
;
...
...
@@ -331,7 +332,7 @@ static int cond_insertf(struct avtab *a, struct avtab_key *k, struct avtab_datum
goto
err
;
}
list
=
kzalloc
(
sizeof
(
struct
cond_av_
list
),
GFP_KERNEL
);
list
=
kzalloc
(
sizeof
(
*
list
),
GFP_KERNEL
);
if
(
!
list
)
{
rc
=
-
ENOMEM
;
goto
err
;
...
...
@@ -420,7 +421,7 @@ static int cond_read_node(struct policydb *p, struct cond_node *node, void *fp)
goto
err
;
rc
=
-
ENOMEM
;
expr
=
kzalloc
(
sizeof
(
struct
cond_
expr
),
GFP_KERNEL
);
expr
=
kzalloc
(
sizeof
(
*
expr
),
GFP_KERNEL
);
if
(
!
expr
)
goto
err
;
...
...
@@ -471,7 +472,7 @@ int cond_read_list(struct policydb *p, void *fp)
for
(
i
=
0
;
i
<
len
;
i
++
)
{
rc
=
-
ENOMEM
;
node
=
kzalloc
(
sizeof
(
struct
cond_
node
),
GFP_KERNEL
);
node
=
kzalloc
(
sizeof
(
*
node
),
GFP_KERNEL
);
if
(
!
node
)
goto
err
;
...
...
@@ -663,5 +664,4 @@ void cond_compute_av(struct avtab *ctab, struct avtab_key *key,
(
node
->
key
.
specified
&
AVTAB_XPERMS
))
services_compute_xperms_drivers
(
xperms
,
node
);
}
return
;
}
security/selinux/ss/hashtab.c
View file @
fa5b5b26
...
...
@@ -17,15 +17,15 @@ struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, const void *
u32
i
;
p
=
kzalloc
(
sizeof
(
*
p
),
GFP_KERNEL
);
if
(
p
==
NULL
)
if
(
!
p
)
return
p
;
p
->
size
=
size
;
p
->
nel
=
0
;
p
->
hash_value
=
hash_value
;
p
->
keycmp
=
keycmp
;
p
->
htable
=
kmalloc
(
sizeof
(
*
(
p
->
htable
))
*
size
,
GFP_KERNEL
);
if
(
p
->
htable
==
NULL
)
{
p
->
htable
=
kmalloc
_array
(
size
,
sizeof
(
*
p
->
htable
)
,
GFP_KERNEL
);
if
(
!
p
->
htable
)
{
kfree
(
p
);
return
NULL
;
}
...
...
@@ -58,7 +58,7 @@ int hashtab_insert(struct hashtab *h, void *key, void *datum)
return
-
EEXIST
;
newnode
=
kzalloc
(
sizeof
(
*
newnode
),
GFP_KERNEL
);
if
(
newnode
==
NULL
)
if
(
!
newnode
)
return
-
ENOMEM
;
newnode
->
key
=
key
;
newnode
->
datum
=
datum
;
...
...
@@ -87,7 +87,7 @@ void *hashtab_search(struct hashtab *h, const void *key)
while
(
cur
&&
h
->
keycmp
(
h
,
key
,
cur
->
key
)
>
0
)
cur
=
cur
->
next
;
if
(
cur
==
NULL
||
(
h
->
keycmp
(
h
,
key
,
cur
->
key
)
!=
0
))
if
(
!
cur
||
(
h
->
keycmp
(
h
,
key
,
cur
->
key
)
!=
0
))
return
NULL
;
return
cur
->
datum
;
...
...
security/selinux/ss/policydb.c
View file @
fa5b5b26
...
...
@@ -178,10 +178,9 @@ static int roles_init(struct policydb *p)
int
rc
;
struct
role_datum
*
role
;
rc
=
-
ENOMEM
;
role
=
kzalloc
(
sizeof
(
*
role
),
GFP_KERNEL
);
if
(
!
role
)
goto
out
;
return
-
ENOMEM
;
rc
=
-
EINVAL
;
role
->
value
=
++
p
->
p_roles
.
nprim
;
...
...
@@ -540,23 +539,23 @@ static int policydb_index(struct policydb *p)
#endif
rc
=
-
ENOMEM
;
p
->
class_val_to_struct
=
kzalloc
(
p
->
p_classes
.
nprim
*
sizeof
(
*
(
p
->
class_val_to_struct
)
),
GFP_KERNEL
);
p
->
class_val_to_struct
=
kcalloc
(
p
->
p_classes
.
nprim
,
sizeof
(
*
p
->
class_val_to_struct
),
GFP_KERNEL
);
if
(
!
p
->
class_val_to_struct
)
goto
out
;
rc
=
-
ENOMEM
;
p
->
role_val_to_struct
=
kzalloc
(
p
->
p_roles
.
nprim
*
sizeof
(
*
(
p
->
role_val_to_struct
)
),
GFP_KERNEL
);
p
->
role_val_to_struct
=
kcalloc
(
p
->
p_roles
.
nprim
,
sizeof
(
*
p
->
role_val_to_struct
),
GFP_KERNEL
);
if
(
!
p
->
role_val_to_struct
)
goto
out
;
rc
=
-
ENOMEM
;
p
->
user_val_to_struct
=
kzalloc
(
p
->
p_users
.
nprim
*
sizeof
(
*
(
p
->
user_val_to_struct
)
),
GFP_KERNEL
);
p
->
user_val_to_struct
=
kcalloc
(
p
->
p_users
.
nprim
,
sizeof
(
*
p
->
user_val_to_struct
),
GFP_KERNEL
);
if
(
!
p
->
user_val_to_struct
)
goto
out
;
...
...
@@ -880,8 +879,6 @@ void policydb_destroy(struct policydb *p)
ebitmap_destroy
(
&
p
->
filename_trans_ttypes
);
ebitmap_destroy
(
&
p
->
policycaps
);
ebitmap_destroy
(
&
p
->
permissive_map
);
return
;
}
/*
...
...
@@ -1120,10 +1117,9 @@ static int perm_read(struct policydb *p, struct hashtab *h, void *fp)
__le32
buf
[
2
];
u32
len
;
rc
=
-
ENOMEM
;
perdatum
=
kzalloc
(
sizeof
(
*
perdatum
),
GFP_KERNEL
);
if
(
!
perdatum
)
goto
bad
;
return
-
ENOMEM
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
buf
);
if
(
rc
)
...
...
@@ -1154,10 +1150,9 @@ static int common_read(struct policydb *p, struct hashtab *h, void *fp)
u32
len
,
nel
;
int
i
,
rc
;
rc
=
-
ENOMEM
;
comdatum
=
kzalloc
(
sizeof
(
*
comdatum
),
GFP_KERNEL
);
if
(
!
comdatum
)
goto
bad
;
return
-
ENOMEM
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
buf
);
if
(
rc
)
...
...
@@ -1320,10 +1315,9 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp)
u32
len
,
len2
,
ncons
,
nel
;
int
i
,
rc
;
rc
=
-
ENOMEM
;
cladatum
=
kzalloc
(
sizeof
(
*
cladatum
),
GFP_KERNEL
);
if
(
!
cladatum
)
goto
bad
;
return
-
ENOMEM
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
)
*
6
);
if
(
rc
)
...
...
@@ -1414,10 +1408,9 @@ static int role_read(struct policydb *p, struct hashtab *h, void *fp)
__le32
buf
[
3
];
u32
len
;
rc
=
-
ENOMEM
;
role
=
kzalloc
(
sizeof
(
*
role
),
GFP_KERNEL
);
if
(
!
role
)
goto
bad
;
return
-
ENOMEM
;
if
(
p
->
policyvers
>=
POLICYDB_VERSION_BOUNDARY
)
to_read
=
3
;
...
...
@@ -1471,10 +1464,9 @@ static int type_read(struct policydb *p, struct hashtab *h, void *fp)
__le32
buf
[
4
];
u32
len
;
rc
=
-
ENOMEM
;
typdatum
=
kzalloc
(
sizeof
(
*
typdatum
),
GFP_KERNEL
);
if
(
!
typdatum
)
goto
bad
;
return
-
ENOMEM
;
if
(
p
->
policyvers
>=
POLICYDB_VERSION_BOUNDARY
)
to_read
=
4
;
...
...
@@ -1546,10 +1538,9 @@ static int user_read(struct policydb *p, struct hashtab *h, void *fp)
__le32
buf
[
3
];
u32
len
;
rc
=
-
ENOMEM
;
usrdatum
=
kzalloc
(
sizeof
(
*
usrdatum
),
GFP_KERNEL
);
if
(
!
usrdatum
)
goto
bad
;
return
-
ENOMEM
;
if
(
p
->
policyvers
>=
POLICYDB_VERSION_BOUNDARY
)
to_read
=
3
;
...
...
@@ -1597,10 +1588,9 @@ static int sens_read(struct policydb *p, struct hashtab *h, void *fp)
__le32
buf
[
2
];
u32
len
;
rc
=
-
ENOMEM
;
levdatum
=
kzalloc
(
sizeof
(
*
levdatum
),
GFP_ATOMIC
);
if
(
!
levdatum
)
goto
bad
;
return
-
ENOMEM
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
buf
);
if
(
rc
)
...
...
@@ -1614,7 +1604,7 @@ static int sens_read(struct policydb *p, struct hashtab *h, void *fp)
goto
bad
;
rc
=
-
ENOMEM
;
levdatum
->
level
=
kmalloc
(
sizeof
(
struct
mls_
level
),
GFP_ATOMIC
);
levdatum
->
level
=
kmalloc
(
sizeof
(
*
levdatum
->
level
),
GFP_ATOMIC
);
if
(
!
levdatum
->
level
)
goto
bad
;
...
...
@@ -1639,10 +1629,9 @@ static int cat_read(struct policydb *p, struct hashtab *h, void *fp)
__le32
buf
[
3
];
u32
len
;
rc
=
-
ENOMEM
;
catdatum
=
kzalloc
(
sizeof
(
*
catdatum
),
GFP_ATOMIC
);
if
(
!
catdatum
)
goto
bad
;
return
-
ENOMEM
;
rc
=
next_entry
(
buf
,
fp
,
sizeof
buf
);
if
(
rc
)
...
...
@@ -1854,7 +1843,7 @@ static int range_read(struct policydb *p, void *fp)
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
));
if
(
rc
)
goto
out
;
return
rc
;
nel
=
le32_to_cpu
(
buf
[
0
]);
for
(
i
=
0
;
i
<
nel
;
i
++
)
{
...
...
@@ -1931,7 +1920,6 @@ static int filename_trans_read(struct policydb *p, void *fp)
nel
=
le32_to_cpu
(
buf
[
0
]);
for
(
i
=
0
;
i
<
nel
;
i
++
)
{
ft
=
NULL
;
otype
=
NULL
;
name
=
NULL
;
...
...
@@ -2008,7 +1996,7 @@ static int genfs_read(struct policydb *p, void *fp)
rc
=
next_entry
(
buf
,
fp
,
sizeof
(
u32
));
if
(
rc
)
goto
out
;
return
rc
;
nel
=
le32_to_cpu
(
buf
[
0
]);
for
(
i
=
0
;
i
<
nel
;
i
++
)
{
...
...
@@ -2100,9 +2088,10 @@ static int genfs_read(struct policydb *p, void *fp)
}
rc
=
0
;
out:
if
(
newgenfs
)
if
(
newgenfs
)
{
kfree
(
newgenfs
->
fstype
);
kfree
(
newgenfs
);
kfree
(
newgenfs
);
}
ocontext_destroy
(
newc
,
OCON_FSUSE
);
return
rc
;
...
...
security/selinux/ss/services.c
View file @
fa5b5b26
...
...
@@ -157,7 +157,7 @@ static int selinux_set_mapping(struct policydb *pol,
}
k
=
0
;
while
(
p_in
->
perms
&&
p_in
->
perms
[
k
])
{
while
(
p_in
->
perms
[
k
])
{
/* An empty permission string skips ahead */
if
(
!*
p_in
->
perms
[
k
])
{
k
++
;
...
...
security/selinux/ss/sidtab.c
View file @
fa5b5b26
...
...
@@ -18,7 +18,7 @@ int sidtab_init(struct sidtab *s)
{
int
i
;
s
->
htable
=
kmalloc
(
sizeof
(
*
(
s
->
htable
))
*
SIDTAB_SIZE
,
GFP_ATOMIC
);
s
->
htable
=
kmalloc
_array
(
SIDTAB_SIZE
,
sizeof
(
*
s
->
htable
)
,
GFP_ATOMIC
);
if
(
!
s
->
htable
)
return
-
ENOMEM
;
for
(
i
=
0
;
i
<
SIDTAB_SIZE
;
i
++
)
...
...
@@ -54,7 +54,7 @@ int sidtab_insert(struct sidtab *s, u32 sid, struct context *context)
}
newnode
=
kmalloc
(
sizeof
(
*
newnode
),
GFP_ATOMIC
);
if
(
newnode
==
NULL
)
{
if
(
!
newnode
)
{
rc
=
-
ENOMEM
;
goto
out
;
}
...
...
@@ -98,7 +98,7 @@ static struct context *sidtab_search_core(struct sidtab *s, u32 sid, int force)
if
(
force
&&
cur
&&
sid
==
cur
->
sid
&&
cur
->
context
.
len
)
return
&
cur
->
context
;
if
(
cur
==
NULL
||
sid
!=
cur
->
sid
||
cur
->
context
.
len
)
{
if
(
!
cur
||
sid
!=
cur
->
sid
||
cur
->
context
.
len
)
{
/* Remap invalid SIDs to the unlabeled SID. */
sid
=
SECINITSID_UNLABELED
;
hvalue
=
SIDTAB_HASH
(
sid
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment