Now when sending stream reset request, it closes the streams to block further xmit of data until this request is completed, then calls sctp_send_reconf to send the chunk. But if sctp_send_reconf returns err, which means the request chunk would not be queued and sent, so the asoc will get stuck, streams are closed and no packet was even queued. This patch is to fix it by closing streams only when request is sent successfully, it is also to fix a return value. Fixes: 7f9d68ac944e ("sctp: implement sender-side procedures for SSN Reset Request Parameter") Signed-off-by: Xin Long <lucien.xin@xxxxxxxxx> --- net/sctp/stream.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/net/sctp/stream.c b/net/sctp/stream.c index 13d5e07..53c67d6 100644 --- a/net/sctp/stream.c +++ b/net/sctp/stream.c @@ -136,8 +136,20 @@ int sctp_send_reset_streams(struct sctp_association *asoc, goto out; chunk = sctp_make_strreset_req(asoc, str_nums, str_list, out, in); - if (!chunk) + if (!chunk) { + retval = -ENOMEM; goto out; + } + + asoc->strreset_chunk = chunk; + sctp_chunk_hold(asoc->strreset_chunk); + + retval = sctp_send_reconf(asoc, chunk); + if (retval) { + sctp_chunk_put(asoc->strreset_chunk); + asoc->strreset_chunk = NULL; + goto out; + } if (out) { if (str_nums) @@ -150,14 +162,6 @@ int sctp_send_reset_streams(struct sctp_association *asoc, } asoc->strreset_outstanding = out + in; - asoc->strreset_chunk = chunk; - sctp_chunk_hold(asoc->strreset_chunk); - - retval = sctp_send_reconf(asoc, chunk); - if (retval) { - sctp_chunk_put(asoc->strreset_chunk); - asoc->strreset_chunk = NULL; - } out: return retval; -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-sctp" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html