sctp: get list_of_streams of strreset outreq earlier
Now when processing strreset out responses, it gets outreq->list_of_streams only when result is performed. But if result is not performed, str_p will be NULL. It will cause panic in sctp_ulpevent_make_stream_reset_event if nums is not 0. This patch is to fix it by getting outreq->list_of_streams earlier, and also to improve some codes for the strreset inreq process. Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
9fd0f31563
commit
edb12f2d72
@@ -732,14 +732,14 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
|||||||
|
|
||||||
if (req->type == SCTP_PARAM_RESET_OUT_REQUEST) {
|
if (req->type == SCTP_PARAM_RESET_OUT_REQUEST) {
|
||||||
struct sctp_strreset_outreq *outreq;
|
struct sctp_strreset_outreq *outreq;
|
||||||
__u16 *str_p = NULL;
|
__u16 *str_p;
|
||||||
|
|
||||||
outreq = (struct sctp_strreset_outreq *)req;
|
outreq = (struct sctp_strreset_outreq *)req;
|
||||||
|
str_p = outreq->list_of_streams;
|
||||||
nums = (ntohs(outreq->param_hdr.length) - sizeof(*outreq)) / 2;
|
nums = (ntohs(outreq->param_hdr.length) - sizeof(*outreq)) / 2;
|
||||||
|
|
||||||
if (result == SCTP_STRRESET_PERFORMED) {
|
if (result == SCTP_STRRESET_PERFORMED) {
|
||||||
if (nums) {
|
if (nums) {
|
||||||
str_p = outreq->list_of_streams;
|
|
||||||
for (i = 0; i < nums; i++)
|
for (i = 0; i < nums; i++)
|
||||||
stream->out[ntohs(str_p[i])].ssn = 0;
|
stream->out[ntohs(str_p[i])].ssn = 0;
|
||||||
} else {
|
} else {
|
||||||
@@ -757,16 +757,16 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
|||||||
nums, str_p, GFP_ATOMIC);
|
nums, str_p, GFP_ATOMIC);
|
||||||
} else if (req->type == SCTP_PARAM_RESET_IN_REQUEST) {
|
} else if (req->type == SCTP_PARAM_RESET_IN_REQUEST) {
|
||||||
struct sctp_strreset_inreq *inreq;
|
struct sctp_strreset_inreq *inreq;
|
||||||
__u16 *str_p = NULL;
|
__u16 *str_p;
|
||||||
|
|
||||||
/* if the result is performed, it's impossible for inreq */
|
/* if the result is performed, it's impossible for inreq */
|
||||||
if (result == SCTP_STRRESET_PERFORMED)
|
if (result == SCTP_STRRESET_PERFORMED)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
inreq = (struct sctp_strreset_inreq *)req;
|
inreq = (struct sctp_strreset_inreq *)req;
|
||||||
|
str_p = inreq->list_of_streams;
|
||||||
nums = (ntohs(inreq->param_hdr.length) - sizeof(*inreq)) / 2;
|
nums = (ntohs(inreq->param_hdr.length) - sizeof(*inreq)) / 2;
|
||||||
|
|
||||||
str_p = inreq->list_of_streams;
|
|
||||||
*evp = sctp_ulpevent_make_stream_reset_event(asoc, flags,
|
*evp = sctp_ulpevent_make_stream_reset_event(asoc, flags,
|
||||||
nums, str_p, GFP_ATOMIC);
|
nums, str_p, GFP_ATOMIC);
|
||||||
} else if (req->type == SCTP_PARAM_RESET_TSN_REQUEST) {
|
} else if (req->type == SCTP_PARAM_RESET_TSN_REQUEST) {
|
||||||
|
|||||||
Reference in New Issue
Block a user