Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
5da028a8
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5da028a8
编写于
6月 27, 2017
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
get_compat_msghdr(): get rid of field-by-field copyin
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
ffb07550
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
14 addition
and
17 deletion
+14
-17
net/compat.c
net/compat.c
+14
-17
未找到文件。
net/compat.c
浏览文件 @
5da028a8
...
...
@@ -37,21 +37,16 @@ int get_compat_msghdr(struct msghdr *kmsg,
struct
sockaddr
__user
**
save_addr
,
struct
iovec
**
iov
)
{
compat_uptr_t
uaddr
,
uiov
,
tmp3
;
compat_size_t
nr_segs
;
struct
compat_msghdr
msg
;
ssize_t
err
;
if
(
!
access_ok
(
VERIFY_READ
,
umsg
,
sizeof
(
*
umsg
))
||
__get_user
(
uaddr
,
&
umsg
->
msg_name
)
||
__get_user
(
kmsg
->
msg_namelen
,
&
umsg
->
msg_namelen
)
||
__get_user
(
uiov
,
&
umsg
->
msg_iov
)
||
__get_user
(
nr_segs
,
&
umsg
->
msg_iovlen
)
||
__get_user
(
tmp3
,
&
umsg
->
msg_control
)
||
__get_user
(
kmsg
->
msg_controllen
,
&
umsg
->
msg_controllen
)
||
__get_user
(
kmsg
->
msg_flags
,
&
umsg
->
msg_flags
))
if
(
copy_from_user
(
&
msg
,
umsg
,
sizeof
(
*
umsg
)))
return
-
EFAULT
;
if
(
!
uaddr
)
kmsg
->
msg_flags
=
msg
.
msg_flags
;
kmsg
->
msg_namelen
=
msg
.
msg_namelen
;
if
(
!
msg
.
msg_name
)
kmsg
->
msg_namelen
=
0
;
if
(
kmsg
->
msg_namelen
<
0
)
...
...
@@ -59,14 +54,16 @@ int get_compat_msghdr(struct msghdr *kmsg,
if
(
kmsg
->
msg_namelen
>
sizeof
(
struct
sockaddr_storage
))
kmsg
->
msg_namelen
=
sizeof
(
struct
sockaddr_storage
);
kmsg
->
msg_control
=
compat_ptr
(
tmp3
);
kmsg
->
msg_control
=
compat_ptr
(
msg
.
msg_control
);
kmsg
->
msg_controllen
=
msg
.
msg_controllen
;
if
(
save_addr
)
*
save_addr
=
compat_ptr
(
uaddr
);
*
save_addr
=
compat_ptr
(
msg
.
msg_name
);
if
(
uaddr
&&
kmsg
->
msg_namelen
)
{
if
(
msg
.
msg_name
&&
kmsg
->
msg_namelen
)
{
if
(
!
save_addr
)
{
err
=
move_addr_to_kernel
(
compat_ptr
(
uaddr
),
err
=
move_addr_to_kernel
(
compat_ptr
(
msg
.
msg_name
),
kmsg
->
msg_namelen
,
kmsg
->
msg_name
);
if
(
err
<
0
)
...
...
@@ -77,13 +74,13 @@ int get_compat_msghdr(struct msghdr *kmsg,
kmsg
->
msg_namelen
=
0
;
}
if
(
nr_segs
>
UIO_MAXIOV
)
if
(
msg
.
msg_iovlen
>
UIO_MAXIOV
)
return
-
EMSGSIZE
;
kmsg
->
msg_iocb
=
NULL
;
return
compat_import_iovec
(
save_addr
?
READ
:
WRITE
,
compat_ptr
(
uiov
),
nr_segs
,
compat_ptr
(
msg
.
msg_iov
),
msg
.
msg_iovlen
,
UIO_FASTIOV
,
iov
,
&
kmsg
->
msg_iter
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录