sctp: fix some type cast warnings introduced by stream reconf

These warnings were found by running 'make C=2 M=net/sctp/'.

They are introduced by not aware of Endian when coding stream
reconf patches.

Since commit c0d8bab6ae ("sctp: add get and set sockopt for
reconf_enable") enabled stream reconf feature for users, the
Fixes tag below would use it.

Fixes: c0d8bab6ae ("sctp: add get and set sockopt for reconf_enable")
Reported-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Xin Long 2017-10-28 19:43:54 +08:00 committed by David S. Miller
parent 50317fce2c
commit 1da4fc97cb
6 changed files with 40 additions and 31 deletions

View File

@ -716,28 +716,28 @@ struct sctp_reconf_chunk {
struct sctp_strreset_outreq { struct sctp_strreset_outreq {
struct sctp_paramhdr param_hdr; struct sctp_paramhdr param_hdr;
__u32 request_seq; __be32 request_seq;
__u32 response_seq; __be32 response_seq;
__u32 send_reset_at_tsn; __be32 send_reset_at_tsn;
__u16 list_of_streams[0]; __be16 list_of_streams[0];
}; };
struct sctp_strreset_inreq { struct sctp_strreset_inreq {
struct sctp_paramhdr param_hdr; struct sctp_paramhdr param_hdr;
__u32 request_seq; __be32 request_seq;
__u16 list_of_streams[0]; __be16 list_of_streams[0];
}; };
struct sctp_strreset_tsnreq { struct sctp_strreset_tsnreq {
struct sctp_paramhdr param_hdr; struct sctp_paramhdr param_hdr;
__u32 request_seq; __be32 request_seq;
}; };
struct sctp_strreset_addstrm { struct sctp_strreset_addstrm {
struct sctp_paramhdr param_hdr; struct sctp_paramhdr param_hdr;
__u32 request_seq; __be32 request_seq;
__u16 number_of_streams; __be16 number_of_streams;
__u16 reserved; __be16 reserved;
}; };
enum { enum {
@ -752,16 +752,16 @@ enum {
struct sctp_strreset_resp { struct sctp_strreset_resp {
struct sctp_paramhdr param_hdr; struct sctp_paramhdr param_hdr;
__u32 response_seq; __be32 response_seq;
__u32 result; __be32 result;
}; };
struct sctp_strreset_resptsn { struct sctp_strreset_resptsn {
struct sctp_paramhdr param_hdr; struct sctp_paramhdr param_hdr;
__u32 response_seq; __be32 response_seq;
__u32 result; __be32 result;
__u32 senders_next_tsn; __be32 senders_next_tsn;
__u32 receivers_next_tsn; __be32 receivers_next_tsn;
}; };
#endif /* __LINUX_SCTP_H__ */ #endif /* __LINUX_SCTP_H__ */

View File

@ -261,7 +261,7 @@ struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
struct sctp_fwdtsn_skip *skiplist); struct sctp_fwdtsn_skip *skiplist);
struct sctp_chunk *sctp_make_auth(const struct sctp_association *asoc); struct sctp_chunk *sctp_make_auth(const struct sctp_association *asoc);
struct sctp_chunk *sctp_make_strreset_req(const struct sctp_association *asoc, struct sctp_chunk *sctp_make_strreset_req(const struct sctp_association *asoc,
__u16 stream_num, __u16 *stream_list, __u16 stream_num, __be16 *stream_list,
bool out, bool in); bool out, bool in);
struct sctp_chunk *sctp_make_strreset_tsnreq( struct sctp_chunk *sctp_make_strreset_tsnreq(
const struct sctp_association *asoc); const struct sctp_association *asoc);

View File

@ -130,7 +130,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(
struct sctp_ulpevent *sctp_ulpevent_make_stream_reset_event( struct sctp_ulpevent *sctp_ulpevent_make_stream_reset_event(
const struct sctp_association *asoc, __u16 flags, const struct sctp_association *asoc, __u16 flags,
__u16 stream_num, __u16 *stream_list, gfp_t gfp); __u16 stream_num, __be16 *stream_list, gfp_t gfp);
struct sctp_ulpevent *sctp_ulpevent_make_assoc_reset_event( struct sctp_ulpevent *sctp_ulpevent_make_assoc_reset_event(
const struct sctp_association *asoc, __u16 flags, const struct sctp_association *asoc, __u16 flags,

View File

@ -3591,7 +3591,7 @@ static struct sctp_chunk *sctp_make_reconf(const struct sctp_association *asoc,
*/ */
struct sctp_chunk *sctp_make_strreset_req( struct sctp_chunk *sctp_make_strreset_req(
const struct sctp_association *asoc, const struct sctp_association *asoc,
__u16 stream_num, __u16 *stream_list, __u16 stream_num, __be16 *stream_list,
bool out, bool in) bool out, bool in)
{ {
struct sctp_strreset_outreq outreq; struct sctp_strreset_outreq outreq;
@ -3788,7 +3788,8 @@ bool sctp_verify_reconf(const struct sctp_association *asoc,
{ {
struct sctp_reconf_chunk *hdr; struct sctp_reconf_chunk *hdr;
union sctp_params param; union sctp_params param;
__u16 last = 0, cnt = 0; __be16 last = 0;
__u16 cnt = 0;
hdr = (struct sctp_reconf_chunk *)chunk->chunk_hdr; hdr = (struct sctp_reconf_chunk *)chunk->chunk_hdr;
sctp_walk_params(param, hdr, params) { sctp_walk_params(param, hdr, params) {

View File

@ -118,6 +118,7 @@ int sctp_send_reset_streams(struct sctp_association *asoc,
__u16 i, str_nums, *str_list; __u16 i, str_nums, *str_list;
struct sctp_chunk *chunk; struct sctp_chunk *chunk;
int retval = -EINVAL; int retval = -EINVAL;
__be16 *nstr_list;
bool out, in; bool out, in;
if (!asoc->peer.reconf_capable || if (!asoc->peer.reconf_capable ||
@ -148,13 +149,18 @@ int sctp_send_reset_streams(struct sctp_association *asoc,
if (str_list[i] >= stream->incnt) if (str_list[i] >= stream->incnt)
goto out; goto out;
for (i = 0; i < str_nums; i++) nstr_list = kcalloc(str_nums, sizeof(__be16), GFP_KERNEL);
str_list[i] = htons(str_list[i]); if (!nstr_list) {
retval = -ENOMEM;
chunk = sctp_make_strreset_req(asoc, str_nums, str_list, out, in); goto out;
}
for (i = 0; i < str_nums; i++) for (i = 0; i < str_nums; i++)
str_list[i] = ntohs(str_list[i]); nstr_list[i] = htons(str_list[i]);
chunk = sctp_make_strreset_req(asoc, str_nums, nstr_list, out, in);
kfree(nstr_list);
if (!chunk) { if (!chunk) {
retval = -ENOMEM; retval = -ENOMEM;
@ -305,7 +311,7 @@ int sctp_send_add_streams(struct sctp_association *asoc,
} }
static struct sctp_paramhdr *sctp_chunk_lookup_strreset_param( static struct sctp_paramhdr *sctp_chunk_lookup_strreset_param(
struct sctp_association *asoc, __u32 resp_seq, struct sctp_association *asoc, __be32 resp_seq,
__be16 type) __be16 type)
{ {
struct sctp_chunk *chunk = asoc->strreset_chunk; struct sctp_chunk *chunk = asoc->strreset_chunk;
@ -345,8 +351,9 @@ struct sctp_chunk *sctp_process_strreset_outreq(
{ {
struct sctp_strreset_outreq *outreq = param.v; struct sctp_strreset_outreq *outreq = param.v;
struct sctp_stream *stream = &asoc->stream; struct sctp_stream *stream = &asoc->stream;
__u16 i, nums, flags = 0, *str_p = NULL;
__u32 result = SCTP_STRRESET_DENIED; __u32 result = SCTP_STRRESET_DENIED;
__u16 i, nums, flags = 0;
__be16 *str_p = NULL;
__u32 request_seq; __u32 request_seq;
request_seq = ntohl(outreq->request_seq); request_seq = ntohl(outreq->request_seq);
@ -439,8 +446,9 @@ struct sctp_chunk *sctp_process_strreset_inreq(
struct sctp_stream *stream = &asoc->stream; struct sctp_stream *stream = &asoc->stream;
__u32 result = SCTP_STRRESET_DENIED; __u32 result = SCTP_STRRESET_DENIED;
struct sctp_chunk *chunk = NULL; struct sctp_chunk *chunk = NULL;
__u16 i, nums, *str_p;
__u32 request_seq; __u32 request_seq;
__u16 i, nums;
__be16 *str_p;
request_seq = ntohl(inreq->request_seq); request_seq = ntohl(inreq->request_seq);
if (TSN_lt(asoc->strreset_inseq, request_seq) || if (TSN_lt(asoc->strreset_inseq, request_seq) ||
@ -769,7 +777,7 @@ 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; __be16 *str_p;
outreq = (struct sctp_strreset_outreq *)req; outreq = (struct sctp_strreset_outreq *)req;
str_p = outreq->list_of_streams; str_p = outreq->list_of_streams;
@ -794,7 +802,7 @@ 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; __be16 *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)

View File

@ -847,7 +847,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(
struct sctp_ulpevent *sctp_ulpevent_make_stream_reset_event( struct sctp_ulpevent *sctp_ulpevent_make_stream_reset_event(
const struct sctp_association *asoc, __u16 flags, __u16 stream_num, const struct sctp_association *asoc, __u16 flags, __u16 stream_num,
__u16 *stream_list, gfp_t gfp) __be16 *stream_list, gfp_t gfp)
{ {
struct sctp_stream_reset_event *sreset; struct sctp_stream_reset_event *sreset;
struct sctp_ulpevent *event; struct sctp_ulpevent *event;