Patch "sctp: fix the issue that a __u16 variable may overflow in sctp_ulpq_renege" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
sctp: fix the issue that a __u16 variable may overflow in sctp_ulpq_renege
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
sctp-fix-the-issue-that-a-__u16-variable-may-overflow-in-sctp_ulpq_renege.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Wed Feb 28 16:23:28 CET 2018
From: Xin Long <[email protected]>
Date: Mon, 18 Dec 2017 14:07:25 +0800
Subject: sctp: fix the issue that a __u16 variable may overflow in sctp_ulpq_renege
From: Xin Long <[email protected]>
[ Upstream commit 5c468674d17056148da06218d4da5d04baf22eac ]
Now when reneging events in sctp_ulpq_renege(), the variable freed could be increased by a __u16 value twice while freed is of __u16 type. It means freed may overflow at the second addition.
This patch is to fix it by using __u32 type for 'freed', while at it, also to remove 'if (chunk)' check, as all renege commands are generated in sctp_eat_data and it can't be NULL.
--- net/sctp/ulpqueue.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-)
net/sctp/ulpqueue.c +8 -16
@@ -1084,29 +1084,21 @@ void sctp_ulpq_partial_delivery(struct svoid sctp_ulpq_renege (struct sctp_ulpq *ulpq,struct sctp_chunk *chunk,gfp_t gfp) { -struct sctp_association *asoc; -__u16 needed, freed; +struct sctp_association *asoc = ulpq->asoc; +__u32 freed =0 ; +__u16 needed; - asoc = ulpq->asoc; - -if (chunk) { - needed =ntohs (chunk->chunk_hdr->length); - needed -=sizeof (struct sctp_data_chunk ); - }else - needed =SCTP_DEFAULT_MAXWINDOW ; - - freed =0 ; + needed =ntohs (chunk->chunk_hdr->length) - +sizeof (struct sctp_data_chunk );if (skb_queue_empty (&asoc->base.sk->sk_receive_queue)) { freed =sctp_ulpq_renege_order (ulpq, needed); -if (freed < needed) { +if (freed < needed) freed +=sctp_ulpq_renege_frags (ulpq, needed - freed); - } }/* If able to free enough room, accept this chunk. */ -if (chunk && (freed >= needed)) { -int retval; - retval =sctp_ulpq_tail_data (ulpq, chunk, gfp); +if (freed >= needed) { +int retval =sctp_ulpq_tail_data (ulpq, chunk, gfp);/* * Enter partial delivery if chunk has not been * delivered; otherwise, drain the reassembly queue.
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/ip_gre-remove-the-incorrect-mtu-limit-for-ipgre-tap.patch queue-4.14/ip6_gre-remove-the-incorrect-mtu-limit-for-ipgre-tap.patch queue-4.14/ip6_tunnel-allow-ip6gre-dev-mtu-to-be-set-below-1280.patch queue-4.14/vxlan-update-skb-dst-pmtu-on-tx-path.patch queue-4.14/ip6_tunnel-get-the-min-mtu-properly-in-ip6_tnl_xmit.patch queue-4.14/sctp-fix-the-issue-that-a-__u16-variable-may-overflow-in-sctp_ulpq_renege.patch