Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
5ed0127f
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
5ed0127f
编写于
5月 27, 2018
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
signalfd: lift sigmask copyin and size checks to callers of do_signalfd4()
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
87a3002a
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
25 deletion
+25
-25
fs/signalfd.c
fs/signalfd.c
+25
-25
未找到文件。
fs/signalfd.c
浏览文件 @
5ed0127f
...
...
@@ -256,10 +256,8 @@ static const struct file_operations signalfd_fops = {
.
llseek
=
noop_llseek
,
};
static
int
do_signalfd4
(
int
ufd
,
sigset_t
__user
*
user_mask
,
size_t
sizemask
,
int
flags
)
static
int
do_signalfd4
(
int
ufd
,
sigset_t
*
mask
,
int
flags
)
{
sigset_t
sigmask
;
struct
signalfd_ctx
*
ctx
;
/* Check the SFD_* constants for consistency. */
...
...
@@ -269,18 +267,15 @@ static int do_signalfd4(int ufd, sigset_t __user *user_mask, size_t sizemask,
if
(
flags
&
~
(
SFD_CLOEXEC
|
SFD_NONBLOCK
))
return
-
EINVAL
;
if
(
sizemask
!=
sizeof
(
sigset_t
)
||
copy_from_user
(
&
sigmask
,
user_mask
,
sizeof
(
sigmask
)))
return
-
EINVAL
;
sigdelsetmask
(
&
sigmask
,
sigmask
(
SIGKILL
)
|
sigmask
(
SIGSTOP
));
signotset
(
&
sigmask
);
sigdelsetmask
(
mask
,
sigmask
(
SIGKILL
)
|
sigmask
(
SIGSTOP
));
signotset
(
mask
);
if
(
ufd
==
-
1
)
{
ctx
=
kmalloc
(
sizeof
(
*
ctx
),
GFP_KERNEL
);
if
(
!
ctx
)
return
-
ENOMEM
;
ctx
->
sigmask
=
sig
mask
;
ctx
->
sigmask
=
*
mask
;
/*
* When we call this, the initialization must be complete, since
...
...
@@ -300,7 +295,7 @@ static int do_signalfd4(int ufd, sigset_t __user *user_mask, size_t sizemask,
return
-
EINVAL
;
}
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
ctx
->
sigmask
=
sig
mask
;
ctx
->
sigmask
=
*
mask
;
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
wake_up
(
&
current
->
sighand
->
signalfd_wqh
);
...
...
@@ -313,46 +308,51 @@ static int do_signalfd4(int ufd, sigset_t __user *user_mask, size_t sizemask,
SYSCALL_DEFINE4
(
signalfd4
,
int
,
ufd
,
sigset_t
__user
*
,
user_mask
,
size_t
,
sizemask
,
int
,
flags
)
{
return
do_signalfd4
(
ufd
,
user_mask
,
sizemask
,
flags
);
sigset_t
mask
;
if
(
sizemask
!=
sizeof
(
sigset_t
)
||
copy_from_user
(
&
mask
,
user_mask
,
sizeof
(
mask
)))
return
-
EINVAL
;
return
do_signalfd4
(
ufd
,
&
mask
,
flags
);
}
SYSCALL_DEFINE3
(
signalfd
,
int
,
ufd
,
sigset_t
__user
*
,
user_mask
,
size_t
,
sizemask
)
{
return
do_signalfd4
(
ufd
,
user_mask
,
sizemask
,
0
);
sigset_t
mask
;
if
(
sizemask
!=
sizeof
(
sigset_t
)
||
copy_from_user
(
&
mask
,
user_mask
,
sizeof
(
mask
)))
return
-
EINVAL
;
return
do_signalfd4
(
ufd
,
&
mask
,
0
);
}
#ifdef CONFIG_COMPAT
static
long
do_compat_signalfd4
(
int
ufd
,
const
compat_sigset_t
__user
*
sig
mask
,
const
compat_sigset_t
__user
*
user_
mask
,
compat_size_t
sigsetsize
,
int
flags
)
{
sigset_t
tmp
;
sigset_t
__user
*
ksigmask
;
sigset_t
mask
;
if
(
sigsetsize
!=
sizeof
(
compat_sigset_t
))
return
-
EINVAL
;
if
(
get_compat_sigset
(
&
tmp
,
sigmask
))
return
-
EFAULT
;
ksigmask
=
compat_alloc_user_space
(
sizeof
(
sigset_t
));
if
(
copy_to_user
(
ksigmask
,
&
tmp
,
sizeof
(
sigset_t
)))
if
(
get_compat_sigset
(
&
mask
,
user_mask
))
return
-
EFAULT
;
return
do_signalfd4
(
ufd
,
ksigmask
,
sizeof
(
sigset_t
),
flags
);
return
do_signalfd4
(
ufd
,
&
mask
,
flags
);
}
COMPAT_SYSCALL_DEFINE4
(
signalfd4
,
int
,
ufd
,
const
compat_sigset_t
__user
*
,
sig
mask
,
const
compat_sigset_t
__user
*
,
user_
mask
,
compat_size_t
,
sigsetsize
,
int
,
flags
)
{
return
do_compat_signalfd4
(
ufd
,
sig
mask
,
sigsetsize
,
flags
);
return
do_compat_signalfd4
(
ufd
,
user_
mask
,
sigsetsize
,
flags
);
}
COMPAT_SYSCALL_DEFINE3
(
signalfd
,
int
,
ufd
,
const
compat_sigset_t
__user
*
,
sig
mask
,
const
compat_sigset_t
__user
*
,
user_
mask
,
compat_size_t
,
sigsetsize
)
{
return
do_compat_signalfd4
(
ufd
,
sig
mask
,
sigsetsize
,
0
);
return
do_compat_signalfd4
(
ufd
,
user_
mask
,
sigsetsize
,
0
);
}
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录