Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
19e3c66b
K
Kernel
项目概览
openeuler
/
Kernel
大约 1 年 前同步成功
通知
5
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
19e3c66b
编写于
11月 24, 2014
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ipv6 equivalent of "ipv4: Avoid reading user iov twice after raw_probe_proto_opt"
Signed-off-by:
N
Al Viro
<
viro@zeniv.linux.org.uk
>
上级
b61e9dcc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
56 addition
and
56 deletion
+56
-56
net/ipv6/raw.c
net/ipv6/raw.c
+56
-56
未找到文件。
net/ipv6/raw.c
浏览文件 @
19e3c66b
...
...
@@ -672,65 +672,62 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
return
err
;
}
static
int
rawv6_probe_proto_opt
(
struct
flowi6
*
fl6
,
struct
msghdr
*
msg
)
struct
raw6_frag_vec
{
struct
msghdr
*
msg
;
int
hlen
;
char
c
[
4
];
};
static
int
rawv6_probe_proto_opt
(
struct
raw6_frag_vec
*
rfv
,
struct
flowi6
*
fl6
)
{
struct
iovec
*
iov
;
u8
__user
*
type
=
NULL
;
u8
__user
*
code
=
NULL
;
u8
len
=
0
;
int
probed
=
0
;
int
i
;
if
(
!
msg
->
msg_iov
)
return
0
;
int
err
=
0
;
switch
(
fl6
->
flowi6_proto
)
{
case
IPPROTO_ICMPV6
:
rfv
->
hlen
=
2
;
err
=
memcpy_from_msg
(
rfv
->
c
,
rfv
->
msg
,
rfv
->
hlen
);
if
(
!
err
)
{
fl6
->
fl6_icmp_type
=
rfv
->
c
[
0
];
fl6
->
fl6_icmp_code
=
rfv
->
c
[
1
];
}
break
;
case
IPPROTO_MH
:
rfv
->
hlen
=
4
;
err
=
memcpy_from_msg
(
rfv
->
c
,
rfv
->
msg
,
rfv
->
hlen
);
if
(
!
err
)
fl6
->
fl6_mh_type
=
rfv
->
c
[
2
];
}
return
err
;
}
for
(
i
=
0
;
i
<
msg
->
msg_iovlen
;
i
++
)
{
iov
=
&
msg
->
msg_iov
[
i
];
if
(
!
iov
)
continue
;
static
int
raw6_getfrag
(
void
*
from
,
char
*
to
,
int
offset
,
int
len
,
int
odd
,
struct
sk_buff
*
skb
)
{
struct
raw6_frag_vec
*
rfv
=
from
;
switch
(
fl6
->
flowi6_proto
)
{
case
IPPROTO_ICMPV6
:
/* check if one-byte field is readable or not. */
if
(
iov
->
iov_base
&&
iov
->
iov_len
<
1
)
break
;
if
(
!
type
)
{
type
=
iov
->
iov_base
;
/* check if code field is readable or not. */
if
(
iov
->
iov_len
>
1
)
code
=
type
+
1
;
}
else
if
(
!
code
)
code
=
iov
->
iov_base
;
if
(
type
&&
code
)
{
if
(
get_user
(
fl6
->
fl6_icmp_type
,
type
)
||
get_user
(
fl6
->
fl6_icmp_code
,
code
))
return
-
EFAULT
;
probed
=
1
;
}
break
;
case
IPPROTO_MH
:
if
(
iov
->
iov_base
&&
iov
->
iov_len
<
1
)
break
;
/* check if type field is readable or not. */
if
(
iov
->
iov_len
>
2
-
len
)
{
u8
__user
*
p
=
iov
->
iov_base
;
if
(
get_user
(
fl6
->
fl6_mh_type
,
&
p
[
2
-
len
]))
return
-
EFAULT
;
probed
=
1
;
}
else
len
+=
iov
->
iov_len
;
if
(
offset
<
rfv
->
hlen
)
{
int
copy
=
min
(
rfv
->
hlen
-
offset
,
len
);
break
;
default:
probed
=
1
;
break
;
}
if
(
probed
)
break
;
if
(
skb
->
ip_summed
==
CHECKSUM_PARTIAL
)
memcpy
(
to
,
rfv
->
c
+
offset
,
copy
);
else
skb
->
csum
=
csum_block_add
(
skb
->
csum
,
csum_partial_copy_nocheck
(
rfv
->
c
+
offset
,
to
,
copy
,
0
),
odd
);
odd
=
0
;
offset
+=
copy
;
to
+=
copy
;
len
-=
copy
;
if
(
!
len
)
return
0
;
}
return
0
;
offset
-=
rfv
->
hlen
;
return
ip_generic_getfrag
(
rfv
->
msg
->
msg_iov
,
to
,
offset
,
len
,
odd
,
skb
);
}
static
int
rawv6_sendmsg
(
struct
kiocb
*
iocb
,
struct
sock
*
sk
,
...
...
@@ -745,6 +742,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
struct
ipv6_txoptions
*
opt
=
NULL
;
struct
ip6_flowlabel
*
flowlabel
=
NULL
;
struct
dst_entry
*
dst
=
NULL
;
struct
raw6_frag_vec
rfv
;
struct
flowi6
fl6
;
int
addr_len
=
msg
->
msg_namelen
;
int
hlimit
=
-
1
;
...
...
@@ -848,7 +846,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
opt
=
ipv6_fixup_options
(
&
opt_space
,
opt
);
fl6
.
flowi6_proto
=
proto
;
err
=
rawv6_probe_proto_opt
(
&
fl6
,
msg
);
rfv
.
msg
=
msg
;
rfv
.
hlen
=
0
;
err
=
rawv6_probe_proto_opt
(
&
rfv
,
&
fl6
);
if
(
err
)
goto
out
;
...
...
@@ -889,7 +889,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
err
=
rawv6_send_hdrinc
(
sk
,
msg
->
msg_iov
,
len
,
&
fl6
,
&
dst
,
msg
->
msg_flags
);
else
{
lock_sock
(
sk
);
err
=
ip6_append_data
(
sk
,
ip_generic_getfrag
,
msg
->
msg_io
v
,
err
=
ip6_append_data
(
sk
,
raw6_getfrag
,
&
rf
v
,
len
,
0
,
hlimit
,
tclass
,
opt
,
&
fl6
,
(
struct
rt6_info
*
)
dst
,
msg
->
msg_flags
,
dontfrag
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录