Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
974f7bc5
Commit
974f7bc5
authored
Oct 28, 2005
by
Arnaldo Carvalho de Melo
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/sridhar/lksctp-2.6
parents
89fbb69c
64a0c1c8
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
64 additions
and
42 deletions
+64
-42
include/net/sctp/user.h
include/net/sctp/user.h
+4
-4
net/sctp/sm_make_chunk.c
net/sctp/sm_make_chunk.c
+1
-1
net/sctp/socket.c
net/sctp/socket.c
+56
-34
net/sctp/ulpevent.c
net/sctp/ulpevent.c
+3
-3
No files found.
include/net/sctp/user.h
View file @
974f7bc5
...
...
@@ -171,10 +171,10 @@ struct sctp_sndrcvinfo {
*/
enum
sctp_sinfo_flags
{
MSG
_UNORDERED
=
1
,
/* Send/receive message unordered. */
MSG
_ADDR_OVER
=
2
,
/* Override the primary destination. */
MSG
_ABORT
=
4
,
/* Send an ABORT message to the peer. */
/* MSG_EOF is already defined per socket.h */
SCTP
_UNORDERED
=
1
,
/* Send/receive message unordered. */
SCTP
_ADDR_OVER
=
2
,
/* Override the primary destination. */
SCTP
_ABORT
=
4
,
/* Send an ABORT message to the peer. */
SCTP_EOF
=
MSG_FIN
,
/* Initiate graceful shutdown process. */
};
...
...
net/sctp/sm_make_chunk.c
View file @
974f7bc5
...
...
@@ -554,7 +554,7 @@ struct sctp_chunk *sctp_make_datafrag_empty(struct sctp_association *asoc,
dp
.
ppid
=
sinfo
->
sinfo_ppid
;
/* Set the flags for an unordered send. */
if
(
sinfo
->
sinfo_flags
&
MSG
_UNORDERED
)
{
if
(
sinfo
->
sinfo_flags
&
SCTP
_UNORDERED
)
{
flags
|=
SCTP_DATA_UNORDERED
;
dp
.
ssn
=
0
;
}
else
...
...
net/sctp/socket.c
View file @
974f7bc5
...
...
@@ -1010,6 +1010,19 @@ static int __sctp_connect(struct sock* sk,
err
=
-
EAGAIN
;
goto
out_free
;
}
}
else
{
/*
* If an unprivileged user inherits a 1-many
* style socket with open associations on a
* privileged port, it MAY be permitted to
* accept new associations, but it SHOULD NOT
* be permitted to open new associations.
*/
if
(
ep
->
base
.
bind_addr
.
port
<
PROT_SOCK
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
{
err
=
-
EACCES
;
goto
out_free
;
}
}
scope
=
sctp_scope
(
&
to
);
...
...
@@ -1389,27 +1402,27 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
SCTP_DEBUG_PRINTK
(
"msg_len: %zu, sinfo_flags: 0x%x
\n
"
,
msg_len
,
sinfo_flags
);
/*
MSG_EOF or MSG
_ABORT cannot be set on a TCP-style socket. */
if
(
sctp_style
(
sk
,
TCP
)
&&
(
sinfo_flags
&
(
MSG_EOF
|
MSG
_ABORT
)))
{
/*
SCTP_EOF or SCTP
_ABORT cannot be set on a TCP-style socket. */
if
(
sctp_style
(
sk
,
TCP
)
&&
(
sinfo_flags
&
(
SCTP_EOF
|
SCTP
_ABORT
)))
{
err
=
-
EINVAL
;
goto
out_nounlock
;
}
/* If
MSG
_EOF is set, no data can be sent. Disallow sending zero
* length messages when
MSG_EOF|MSG
_ABORT is not set.
* If
MSG
_ABORT is set, the message length could be non zero with
/* If
SCTP
_EOF is set, no data can be sent. Disallow sending zero
* length messages when
SCTP_EOF|SCTP
_ABORT is not set.
* If
SCTP
_ABORT is set, the message length could be non zero with
* the msg_iov set to the user abort reason.
*/
if
(((
sinfo_flags
&
MSG
_EOF
)
&&
(
msg_len
>
0
))
||
(
!
(
sinfo_flags
&
(
MSG_EOF
|
MSG
_ABORT
))
&&
(
msg_len
==
0
)))
{
if
(((
sinfo_flags
&
SCTP
_EOF
)
&&
(
msg_len
>
0
))
||
(
!
(
sinfo_flags
&
(
SCTP_EOF
|
SCTP
_ABORT
))
&&
(
msg_len
==
0
)))
{
err
=
-
EINVAL
;
goto
out_nounlock
;
}
/* If
MSG
_ADDR_OVER is set, there must be an address
/* If
SCTP
_ADDR_OVER is set, there must be an address
* specified in msg_name.
*/
if
((
sinfo_flags
&
MSG
_ADDR_OVER
)
&&
(
!
msg
->
msg_name
))
{
if
((
sinfo_flags
&
SCTP
_ADDR_OVER
)
&&
(
!
msg
->
msg_name
))
{
err
=
-
EINVAL
;
goto
out_nounlock
;
}
...
...
@@ -1458,14 +1471,14 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
goto
out_unlock
;
}
if
(
sinfo_flags
&
MSG
_EOF
)
{
if
(
sinfo_flags
&
SCTP
_EOF
)
{
SCTP_DEBUG_PRINTK
(
"Shutting down association: %p
\n
"
,
asoc
);
sctp_primitive_SHUTDOWN
(
asoc
,
NULL
);
err
=
0
;
goto
out_unlock
;
}
if
(
sinfo_flags
&
MSG
_ABORT
)
{
if
(
sinfo_flags
&
SCTP
_ABORT
)
{
SCTP_DEBUG_PRINTK
(
"Aborting association: %p
\n
"
,
asoc
);
sctp_primitive_ABORT
(
asoc
,
msg
);
err
=
0
;
...
...
@@ -1477,7 +1490,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
if
(
!
asoc
)
{
SCTP_DEBUG_PRINTK
(
"There is no association yet.
\n
"
);
if
(
sinfo_flags
&
(
MSG_EOF
|
MSG
_ABORT
))
{
if
(
sinfo_flags
&
(
SCTP_EOF
|
SCTP
_ABORT
))
{
err
=
-
EINVAL
;
goto
out_unlock
;
}
...
...
@@ -1515,6 +1528,19 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
err
=
-
EAGAIN
;
goto
out_unlock
;
}
}
else
{
/*
* If an unprivileged user inherits a one-to-many
* style socket with open associations on a privileged
* port, it MAY be permitted to accept new associations,
* but it SHOULD NOT be permitted to open new
* associations.
*/
if
(
ep
->
base
.
bind_addr
.
port
<
PROT_SOCK
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
{
err
=
-
EACCES
;
goto
out_unlock
;
}
}
scope
=
sctp_scope
(
&
to
);
...
...
@@ -1611,10 +1637,10 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
/* If an address is passed with the sendto/sendmsg call, it is used
* to override the primary destination address in the TCP model, or
* when
MSG
_ADDR_OVER flag is set in the UDP model.
* when
SCTP
_ADDR_OVER flag is set in the UDP model.
*/
if
((
sctp_style
(
sk
,
TCP
)
&&
msg_name
)
||
(
sinfo_flags
&
MSG
_ADDR_OVER
))
{
(
sinfo_flags
&
SCTP
_ADDR_OVER
))
{
chunk_tp
=
sctp_assoc_lookup_paddr
(
asoc
,
&
to
);
if
(
!
chunk_tp
)
{
err
=
-
EINVAL
;
...
...
@@ -2306,16 +2332,14 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, int optl
return
-
EINVAL
;
if
(
get_user
(
val
,
(
int
__user
*
)
optval
))
return
-
EFAULT
;
if
((
val
<
8
)
||
(
val
>
SCTP_MAX_CHUNK_LEN
))
if
((
val
!=
0
)
&&
((
val
<
8
)
||
(
val
>
SCTP_MAX_CHUNK_LEN
)
))
return
-
EINVAL
;
sp
->
user_frag
=
val
;
if
(
val
)
{
/* Update the frag_point of the existing associations. */
list_for_each
(
pos
,
&
(
sp
->
ep
->
asocs
))
{
asoc
=
list_entry
(
pos
,
struct
sctp_association
,
asocs
);
asoc
->
frag_point
=
sctp_frag_point
(
sp
,
asoc
->
pmtu
);
}
/* Update the frag_point of the existing associations. */
list_for_each
(
pos
,
&
(
sp
->
ep
->
asocs
))
{
asoc
=
list_entry
(
pos
,
struct
sctp_association
,
asocs
);
asoc
->
frag_point
=
sctp_frag_point
(
sp
,
asoc
->
pmtu
);
}
return
0
;
...
...
@@ -2384,14 +2408,14 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva
static
int
sctp_setsockopt_adaption_layer
(
struct
sock
*
sk
,
char
__user
*
optval
,
int
optlen
)
{
__u32
val
;
struct
sctp_setadaption
adaption
;
if
(
optlen
<
sizeof
(
__u32
))
if
(
optlen
!=
sizeof
(
struct
sctp_setadaption
))
return
-
EINVAL
;
if
(
copy_from_user
(
&
val
,
optval
,
sizeof
(
__u32
)))
if
(
copy_from_user
(
&
adaption
,
optval
,
optlen
))
return
-
EFAULT
;
sctp_sk
(
sk
)
->
adaption_ind
=
val
;
sctp_sk
(
sk
)
->
adaption_ind
=
adaption
.
ssb_adaption_ind
;
return
0
;
}
...
...
@@ -3672,17 +3696,15 @@ static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
static
int
sctp_getsockopt_adaption_layer
(
struct
sock
*
sk
,
int
len
,
char
__user
*
optval
,
int
__user
*
optlen
)
{
__u32
val
;
struct
sctp_setadaption
adaption
;
if
(
len
<
sizeof
(
__u32
))
if
(
len
!=
sizeof
(
struct
sctp_setadaption
))
return
-
EINVAL
;
len
=
sizeof
(
__u32
);
val
=
sctp_sk
(
sk
)
->
adaption_ind
;
if
(
put_user
(
len
,
optlen
))
return
-
EFAULT
;
if
(
copy_to_user
(
optval
,
&
val
,
len
))
adaption
.
ssb_adaption_ind
=
sctp_sk
(
sk
)
->
adaption_ind
;
if
(
copy_to_user
(
optval
,
&
adaption
,
len
))
return
-
EFAULT
;
return
0
;
}
...
...
@@ -4640,8 +4662,8 @@ SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg,
/* Minimally, validate the sinfo_flags. */
if
(
cmsgs
->
info
->
sinfo_flags
&
~
(
MSG_UNORDERED
|
MSG
_ADDR_OVER
|
MSG_ABORT
|
MSG
_EOF
))
~
(
SCTP_UNORDERED
|
SCTP
_ADDR_OVER
|
SCTP_ABORT
|
SCTP
_EOF
))
return
-
EINVAL
;
break
;
...
...
net/sctp/ulpevent.c
View file @
974f7bc5
...
...
@@ -698,7 +698,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
event
->
ssn
=
ntohs
(
chunk
->
subh
.
data_hdr
->
ssn
);
event
->
ppid
=
chunk
->
subh
.
data_hdr
->
ppid
;
if
(
chunk
->
chunk_hdr
->
flags
&
SCTP_DATA_UNORDERED
)
{
event
->
flags
|=
MSG
_UNORDERED
;
event
->
flags
|=
SCTP
_UNORDERED
;
event
->
cumtsn
=
sctp_tsnmap_get_ctsn
(
&
asoc
->
peer
.
tsn_map
);
}
event
->
tsn
=
ntohl
(
chunk
->
subh
.
data_hdr
->
tsn
);
...
...
@@ -824,7 +824,7 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
*
* recvmsg() flags:
*
*
MSG
_UNORDERED - This flag is present when the message was sent
*
SCTP
_UNORDERED - This flag is present when the message was sent
* non-ordered.
*/
sinfo
.
sinfo_flags
=
event
->
flags
;
...
...
@@ -839,7 +839,7 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
* This field will hold the current cumulative TSN as
* known by the underlying SCTP layer. Note this field is
* ignored when sending and only valid for a receive
* operation when sinfo_flags are set to
MSG
_UNORDERED.
* operation when sinfo_flags are set to
SCTP
_UNORDERED.
*/
sinfo
.
sinfo_cumtsn
=
event
->
cumtsn
;
/* sinfo_assoc_id: sizeof (sctp_assoc_t)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment