mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-12-30 01:46:30 -05:00
55 lines
2.1 KiB
Diff
55 lines
2.1 KiB
Diff
From bf911e985d6bbaa328c20c3e05f4eb03de11fdd6 Mon Sep 17 00:00:00 2001
|
|
From: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
|
|
Date: Tue, 25 Oct 2016 14:27:39 -0200
|
|
Subject: [PATCH] sctp: validate chunk len before actually using it
|
|
|
|
Andrey Konovalov reported that KASAN detected that SCTP was using a slab
|
|
beyond the boundaries. It was caused because when handling out of the
|
|
blue packets in function sctp_sf_ootb() it was checking the chunk len
|
|
only after already processing the first chunk, validating only for the
|
|
2nd and subsequent ones.
|
|
|
|
The fix is to just move the check upwards so it's also validated for the
|
|
1st chunk.
|
|
|
|
Reported-by: Andrey Konovalov <andreyknvl@google.com>
|
|
Tested-by: Andrey Konovalov <andreyknvl@google.com>
|
|
Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
|
|
Reviewed-by: Xin Long <lucien.xin@gmail.com>
|
|
Acked-by: Neil Horman <nhorman@tuxdriver.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
net/sctp/sm_statefuns.c | 12 ++++++------
|
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
|
|
index 026e3bca4a94b..8ec20a64a3f80 100644
|
|
--- a/net/sctp/sm_statefuns.c
|
|
+++ b/net/sctp/sm_statefuns.c
|
|
@@ -3422,6 +3422,12 @@ sctp_disposition_t sctp_sf_ootb(struct net *net,
|
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
|
commands);
|
|
|
|
+ /* Report violation if chunk len overflows */
|
|
+ ch_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
|
+ if (ch_end > skb_tail_pointer(skb))
|
|
+ return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
|
+ commands);
|
|
+
|
|
/* Now that we know we at least have a chunk header,
|
|
* do things that are type appropriate.
|
|
*/
|
|
@@ -3453,12 +3459,6 @@ sctp_disposition_t sctp_sf_ootb(struct net *net,
|
|
}
|
|
}
|
|
|
|
- /* Report violation if chunk len overflows */
|
|
- ch_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
|
- if (ch_end > skb_tail_pointer(skb))
|
|
- return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
|
- commands);
|
|
-
|
|
ch = (sctp_chunkhdr_t *) ch_end;
|
|
} while (ch_end < skb_tail_pointer(skb));
|
|
|