Do error checking for the SCTP_RESET_STREAMS, SCTP_RESET_ASSOC,
and SCTP_ADD_STREAMS socket options as specified by RFC 6525. MFC after: 3 days
This commit is contained in:
parent
eb6910ccca
commit
f6faece611
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=235057
@ -4164,7 +4164,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
|
|
||||||
SCTP_CHECK_AND_CAST(strrst, optval, struct sctp_reset_streams, optsize);
|
SCTP_CHECK_AND_CAST(strrst, optval, struct sctp_reset_streams, optsize);
|
||||||
SCTP_FIND_STCB(inp, stcb, strrst->srs_assoc_id);
|
SCTP_FIND_STCB(inp, stcb, strrst->srs_assoc_id);
|
||||||
|
|
||||||
if (stcb == NULL) {
|
if (stcb == NULL) {
|
||||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT);
|
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT);
|
||||||
error = ENOENT;
|
error = ENOENT;
|
||||||
@ -4179,15 +4178,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
SCTP_TCB_UNLOCK(stcb);
|
SCTP_TCB_UNLOCK(stcb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!(stcb->asoc.local_strreset_support & SCTP_ENABLE_RESET_STREAM_REQ)) {
|
|
||||||
/*
|
|
||||||
* User did not enable the operation.
|
|
||||||
*/
|
|
||||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EPERM);
|
|
||||||
error = EPERM;
|
|
||||||
SCTP_TCB_UNLOCK(stcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (stcb->asoc.stream_reset_outstanding) {
|
if (stcb->asoc.stream_reset_outstanding) {
|
||||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY);
|
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY);
|
||||||
error = EALREADY;
|
error = EALREADY;
|
||||||
@ -4246,6 +4236,21 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
error = ENOENT;
|
error = ENOENT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (stcb->asoc.peer_supports_strreset == 0) {
|
||||||
|
/*
|
||||||
|
* Peer does not support the chunk type.
|
||||||
|
*/
|
||||||
|
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EOPNOTSUPP);
|
||||||
|
error = EOPNOTSUPP;
|
||||||
|
SCTP_TCB_UNLOCK(stcb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (stcb->asoc.stream_reset_outstanding) {
|
||||||
|
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY);
|
||||||
|
error = EALREADY;
|
||||||
|
SCTP_TCB_UNLOCK(stcb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
if ((stradd->sas_outstrms == 0) &&
|
if ((stradd->sas_outstrms == 0) &&
|
||||||
(stradd->sas_instrms == 0)) {
|
(stradd->sas_instrms == 0)) {
|
||||||
error = EINVAL;
|
error = EINVAL;
|
||||||
@ -4309,15 +4314,6 @@ sctp_setopt(struct socket *so, int optname, void *optval, size_t optsize,
|
|||||||
SCTP_TCB_UNLOCK(stcb);
|
SCTP_TCB_UNLOCK(stcb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!(stcb->asoc.local_strreset_support & SCTP_ENABLE_RESET_ASSOC_REQ)) {
|
|
||||||
/*
|
|
||||||
* User did not enable the operation.
|
|
||||||
*/
|
|
||||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EPERM);
|
|
||||||
error = EPERM;
|
|
||||||
SCTP_TCB_UNLOCK(stcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (stcb->asoc.stream_reset_outstanding) {
|
if (stcb->asoc.stream_reset_outstanding) {
|
||||||
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY);
|
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EALREADY);
|
||||||
error = EALREADY;
|
error = EALREADY;
|
||||||
|
Loading…
Reference in New Issue
Block a user