Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
25243633
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
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看板
提交
25243633
编写于
6月 28, 2007
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge master.kernel.org:/pub/scm/linux/kernel/git/vxy/lksctp-dev
上级
0db3dc73
5131a184
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
81 addition
and
39 deletion
+81
-39
net/sctp/socket.c
net/sctp/socket.c
+81
-39
未找到文件。
net/sctp/socket.c
浏览文件 @
25243633
...
...
@@ -3375,12 +3375,13 @@ static int sctp_getsockopt_sctp_status(struct sock *sk, int len,
sctp_assoc_t
associd
;
int
retval
=
0
;
if
(
len
!=
sizeof
(
status
))
{
if
(
len
<
sizeof
(
status
))
{
retval
=
-
EINVAL
;
goto
out
;
}
if
(
copy_from_user
(
&
status
,
optval
,
sizeof
(
status
)))
{
len
=
sizeof
(
status
);
if
(
copy_from_user
(
&
status
,
optval
,
len
))
{
retval
=
-
EFAULT
;
goto
out
;
}
...
...
@@ -3452,12 +3453,13 @@ static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len,
struct
sctp_transport
*
transport
;
int
retval
=
0
;
if
(
len
!=
sizeof
(
pinfo
))
{
if
(
len
<
sizeof
(
pinfo
))
{
retval
=
-
EINVAL
;
goto
out
;
}
if
(
copy_from_user
(
&
pinfo
,
optval
,
sizeof
(
pinfo
)))
{
len
=
sizeof
(
pinfo
);
if
(
copy_from_user
(
&
pinfo
,
optval
,
len
))
{
retval
=
-
EFAULT
;
goto
out
;
}
...
...
@@ -3523,8 +3525,11 @@ static int sctp_getsockopt_disable_fragments(struct sock *sk, int len,
static
int
sctp_getsockopt_events
(
struct
sock
*
sk
,
int
len
,
char
__user
*
optval
,
int
__user
*
optlen
)
{
if
(
len
!=
sizeof
(
struct
sctp_event_subscribe
))
if
(
len
<
sizeof
(
struct
sctp_event_subscribe
))
return
-
EINVAL
;
len
=
sizeof
(
struct
sctp_event_subscribe
);
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
sctp_sk
(
sk
)
->
subscribe
,
len
))
return
-
EFAULT
;
return
0
;
...
...
@@ -3546,9 +3551,12 @@ static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optv
/* Applicable to UDP-style socket only */
if
(
sctp_style
(
sk
,
TCP
))
return
-
EOPNOTSUPP
;
if
(
len
!=
sizeof
(
int
))
if
(
len
<
sizeof
(
int
))
return
-
EINVAL
;
if
(
copy_to_user
(
optval
,
&
sctp_sk
(
sk
)
->
autoclose
,
len
))
len
=
sizeof
(
int
);
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
sctp_sk
(
sk
)
->
autoclose
,
sizeof
(
int
)))
return
-
EFAULT
;
return
0
;
}
...
...
@@ -3599,8 +3607,9 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
int
retval
=
0
;
struct
sctp_association
*
asoc
;
if
(
len
!=
sizeof
(
sctp_peeloff_arg_t
))
if
(
len
<
sizeof
(
sctp_peeloff_arg_t
))
return
-
EINVAL
;
len
=
sizeof
(
sctp_peeloff_arg_t
);
if
(
copy_from_user
(
&
peeloff
,
optval
,
len
))
return
-
EFAULT
;
...
...
@@ -3628,6 +3637,8 @@ static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval
/* Return the fd mapped to the new socket. */
peeloff
.
sd
=
retval
;
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
peeloff
,
len
))
retval
=
-
EFAULT
;
...
...
@@ -3736,9 +3747,9 @@ static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len,
struct
sctp_association
*
asoc
=
NULL
;
struct
sctp_sock
*
sp
=
sctp_sk
(
sk
);
if
(
len
!=
sizeof
(
struct
sctp_paddrparams
))
if
(
len
<
sizeof
(
struct
sctp_paddrparams
))
return
-
EINVAL
;
len
=
sizeof
(
struct
sctp_paddrparams
);
if
(
copy_from_user
(
&
params
,
optval
,
len
))
return
-
EFAULT
;
...
...
@@ -3837,9 +3848,11 @@ static int sctp_getsockopt_delayed_ack_time(struct sock *sk, int len,
struct
sctp_association
*
asoc
=
NULL
;
struct
sctp_sock
*
sp
=
sctp_sk
(
sk
);
if
(
len
!=
sizeof
(
struct
sctp_assoc_value
))
if
(
len
<
sizeof
(
struct
sctp_assoc_value
))
return
-
EINVAL
;
len
=
sizeof
(
struct
sctp_assoc_value
);
if
(
copy_from_user
(
&
params
,
optval
,
len
))
return
-
EFAULT
;
...
...
@@ -3888,8 +3901,11 @@ static int sctp_getsockopt_delayed_ack_time(struct sock *sk, int len,
*/
static
int
sctp_getsockopt_initmsg
(
struct
sock
*
sk
,
int
len
,
char
__user
*
optval
,
int
__user
*
optlen
)
{
if
(
len
!=
sizeof
(
struct
sctp_initmsg
))
if
(
len
<
sizeof
(
struct
sctp_initmsg
))
return
-
EINVAL
;
len
=
sizeof
(
struct
sctp_initmsg
);
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
sctp_sk
(
sk
)
->
initmsg
,
len
))
return
-
EFAULT
;
return
0
;
...
...
@@ -3904,7 +3920,7 @@ static int sctp_getsockopt_peer_addrs_num_old(struct sock *sk, int len,
struct
list_head
*
pos
;
int
cnt
=
0
;
if
(
len
!=
sizeof
(
sctp_assoc_t
))
if
(
len
<
sizeof
(
sctp_assoc_t
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
id
,
optval
,
sizeof
(
sctp_assoc_t
)))
...
...
@@ -3940,10 +3956,12 @@ static int sctp_getsockopt_peer_addrs_old(struct sock *sk, int len,
struct
sctp_sock
*
sp
=
sctp_sk
(
sk
);
int
addrlen
;
if
(
len
!=
sizeof
(
struct
sctp_getaddrs_old
))
if
(
len
<
sizeof
(
struct
sctp_getaddrs_old
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
getaddrs
,
optval
,
sizeof
(
struct
sctp_getaddrs_old
)))
len
=
sizeof
(
struct
sctp_getaddrs_old
);
if
(
copy_from_user
(
&
getaddrs
,
optval
,
len
))
return
-
EFAULT
;
if
(
getaddrs
.
addr_num
<=
0
)
return
-
EINVAL
;
...
...
@@ -3966,7 +3984,9 @@ static int sctp_getsockopt_peer_addrs_old(struct sock *sk, int len,
if
(
cnt
>=
getaddrs
.
addr_num
)
break
;
}
getaddrs
.
addr_num
=
cnt
;
if
(
copy_to_user
(
optval
,
&
getaddrs
,
sizeof
(
struct
sctp_getaddrs_old
)))
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
getaddrs
,
len
))
return
-
EFAULT
;
return
0
;
...
...
@@ -3999,8 +4019,7 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
return
-
EINVAL
;
to
=
optval
+
offsetof
(
struct
sctp_getaddrs
,
addrs
);
space_left
=
len
-
sizeof
(
struct
sctp_getaddrs
)
-
offsetof
(
struct
sctp_getaddrs
,
addrs
);
space_left
=
len
-
offsetof
(
struct
sctp_getaddrs
,
addrs
);
list_for_each
(
pos
,
&
asoc
->
peer
.
transport_addr_list
)
{
from
=
list_entry
(
pos
,
struct
sctp_transport
,
transports
);
...
...
@@ -4037,7 +4056,7 @@ static int sctp_getsockopt_local_addrs_num_old(struct sock *sk, int len,
rwlock_t
*
addr_lock
;
int
cnt
=
0
;
if
(
len
!=
sizeof
(
sctp_assoc_t
))
if
(
len
<
sizeof
(
sctp_assoc_t
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
id
,
optval
,
sizeof
(
sctp_assoc_t
)))
...
...
@@ -4179,10 +4198,11 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len,
void
*
buf
;
int
bytes_copied
=
0
;
if
(
len
!=
sizeof
(
struct
sctp_getaddrs_old
))
if
(
len
<
sizeof
(
struct
sctp_getaddrs_old
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
getaddrs
,
optval
,
sizeof
(
struct
sctp_getaddrs_old
)))
len
=
sizeof
(
struct
sctp_getaddrs_old
);
if
(
copy_from_user
(
&
getaddrs
,
optval
,
len
))
return
-
EFAULT
;
if
(
getaddrs
.
addr_num
<=
0
)
return
-
EINVAL
;
...
...
@@ -4254,7 +4274,7 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len,
/* copy the leading structure back to user */
getaddrs
.
addr_num
=
cnt
;
if
(
copy_to_user
(
optval
,
&
getaddrs
,
sizeof
(
struct
sctp_getaddrs_old
)
))
if
(
copy_to_user
(
optval
,
&
getaddrs
,
len
))
err
=
-
EFAULT
;
error:
...
...
@@ -4282,7 +4302,7 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
void
*
addrs
;
void
*
buf
;
if
(
len
<
=
sizeof
(
struct
sctp_getaddrs
))
if
(
len
<
sizeof
(
struct
sctp_getaddrs
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
getaddrs
,
optval
,
sizeof
(
struct
sctp_getaddrs
)))
...
...
@@ -4306,8 +4326,8 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
}
to
=
optval
+
offsetof
(
struct
sctp_getaddrs
,
addrs
);
space_left
=
len
-
sizeof
(
struct
sctp_getaddrs
)
-
offsetof
(
struct
sctp_getaddrs
,
addrs
);
space_left
=
len
-
offsetof
(
struct
sctp_getaddrs
,
addrs
);
addrs
=
kmalloc
(
space_left
,
GFP_KERNEL
);
if
(
!
addrs
)
return
-
ENOMEM
;
...
...
@@ -4379,10 +4399,12 @@ static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
struct
sctp_association
*
asoc
;
struct
sctp_sock
*
sp
=
sctp_sk
(
sk
);
if
(
len
!=
sizeof
(
struct
sctp_prim
))
if
(
len
<
sizeof
(
struct
sctp_prim
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
prim
,
optval
,
sizeof
(
struct
sctp_prim
)))
len
=
sizeof
(
struct
sctp_prim
);
if
(
copy_from_user
(
&
prim
,
optval
,
len
))
return
-
EFAULT
;
asoc
=
sctp_id2assoc
(
sk
,
prim
.
ssp_assoc_id
);
...
...
@@ -4398,7 +4420,9 @@ static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
sctp_get_pf_specific
(
sk
->
sk_family
)
->
addr_v4map
(
sp
,
(
union
sctp_addr
*
)
&
prim
.
ssp_addr
);
if
(
copy_to_user
(
optval
,
&
prim
,
sizeof
(
struct
sctp_prim
)))
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
prim
,
len
))
return
-
EFAULT
;
return
0
;
...
...
@@ -4415,10 +4439,15 @@ static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len,
{
struct
sctp_setadaptation
adaptation
;
if
(
len
!=
sizeof
(
struct
sctp_setadaptation
))
if
(
len
<
sizeof
(
struct
sctp_setadaptation
))
return
-
EINVAL
;
len
=
sizeof
(
struct
sctp_setadaptation
);
adaptation
.
ssb_adaptation_ind
=
sctp_sk
(
sk
)
->
adaptation_ind
;
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
adaptation
,
len
))
return
-
EFAULT
;
...
...
@@ -4452,9 +4481,12 @@ static int sctp_getsockopt_default_send_param(struct sock *sk,
struct
sctp_association
*
asoc
;
struct
sctp_sock
*
sp
=
sctp_sk
(
sk
);
if
(
len
!=
sizeof
(
struct
sctp_sndrcvinfo
))
if
(
len
<
sizeof
(
struct
sctp_sndrcvinfo
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
info
,
optval
,
sizeof
(
struct
sctp_sndrcvinfo
)))
len
=
sizeof
(
struct
sctp_sndrcvinfo
);
if
(
copy_from_user
(
&
info
,
optval
,
len
))
return
-
EFAULT
;
asoc
=
sctp_id2assoc
(
sk
,
info
.
sinfo_assoc_id
);
...
...
@@ -4475,7 +4507,9 @@ static int sctp_getsockopt_default_send_param(struct sock *sk,
info
.
sinfo_timetolive
=
sp
->
default_timetolive
;
}
if
(
copy_to_user
(
optval
,
&
info
,
sizeof
(
struct
sctp_sndrcvinfo
)))
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
info
,
len
))
return
-
EFAULT
;
return
0
;
...
...
@@ -4526,10 +4560,12 @@ static int sctp_getsockopt_rtoinfo(struct sock *sk, int len,
struct
sctp_rtoinfo
rtoinfo
;
struct
sctp_association
*
asoc
;
if
(
len
!=
sizeof
(
struct
sctp_rtoinfo
))
if
(
len
<
sizeof
(
struct
sctp_rtoinfo
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
rtoinfo
,
optval
,
sizeof
(
struct
sctp_rtoinfo
)))
len
=
sizeof
(
struct
sctp_rtoinfo
);
if
(
copy_from_user
(
&
rtoinfo
,
optval
,
len
))
return
-
EFAULT
;
asoc
=
sctp_id2assoc
(
sk
,
rtoinfo
.
srto_assoc_id
);
...
...
@@ -4581,11 +4617,12 @@ static int sctp_getsockopt_associnfo(struct sock *sk, int len,
struct
list_head
*
pos
;
int
cnt
=
0
;
if
(
len
!=
sizeof
(
struct
sctp_assocparams
))
if
(
len
<
sizeof
(
struct
sctp_assocparams
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
assocparams
,
optval
,
sizeof
(
struct
sctp_assocparams
)))
len
=
sizeof
(
struct
sctp_assocparams
);
if
(
copy_from_user
(
&
assocparams
,
optval
,
len
))
return
-
EFAULT
;
asoc
=
sctp_id2assoc
(
sk
,
assocparams
.
sasoc_assoc_id
);
...
...
@@ -4671,9 +4708,11 @@ static int sctp_getsockopt_context(struct sock *sk, int len,
struct
sctp_sock
*
sp
;
struct
sctp_association
*
asoc
;
if
(
len
!=
sizeof
(
struct
sctp_assoc_value
))
if
(
len
<
sizeof
(
struct
sctp_assoc_value
))
return
-
EINVAL
;
len
=
sizeof
(
struct
sctp_assoc_value
);
if
(
copy_from_user
(
&
params
,
optval
,
len
))
return
-
EFAULT
;
...
...
@@ -6084,8 +6123,11 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
* queued to the backlog. This prevents a potential race between
* backlog processing on the old socket and new-packet processing
* on the new socket.
*
* The caller has just allocated newsk so we can guarantee that other
* paths won't try to lock it and then oldsk.
*/
sctp_lock_sock
(
newsk
);
lock_sock_nested
(
newsk
,
SINGLE_DEPTH_NESTING
);
sctp_assoc_migrate
(
assoc
,
newsk
);
/* If the association on the newsk is already closed before accept()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录