Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
fa5b5b26
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
fa5b5b26
编写于
4月 19, 2017
作者:
J
James Morris
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'stable-4.12' of
git://git.infradead.org/users/pcmoore/selinux
into next
上级
30a83251
cae303df
变更
11
显示空白变更内容
内联
并排
Showing
11 changed file
with
69 addition
and
70 deletion
+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
未找到文件。
fs/namei.c
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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,22 +539,22 @@ 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
)
),
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
)
),
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
)
),
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
);
}
ocontext_destroy
(
newc
,
OCON_FSUSE
);
return
rc
;
...
...
security/selinux/ss/services.c
浏览文件 @
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
浏览文件 @
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
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录