]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - queue-4.19/sctp-free-cookie-before-we-memdup-a-new-one.patch-9156
fix up the 5.1 queue :(
[thirdparty/kernel/stable-queue.git] / queue-4.19 / sctp-free-cookie-before-we-memdup-a-new-one.patch-9156
CommitLineData
a15a8890
SL
1From 94952b029ca67d652a477f4d01300a91fdf05f26 Mon Sep 17 00:00:00 2001
2From: Neil Horman <nhorman@tuxdriver.com>
3Date: Thu, 13 Jun 2019 06:35:59 -0400
4Subject: sctp: Free cookie before we memdup a new one
5
6[ Upstream commit ce950f1050cece5e406a5cde723c69bba60e1b26 ]
7
8Based on comments from Xin, even after fixes for our recent syzbot
9report of cookie memory leaks, its possible to get a resend of an INIT
10chunk which would lead to us leaking cookie memory.
11
12To ensure that we don't leak cookie memory, free any previously
13allocated cookie first.
14
15Change notes
16v1->v2
17update subsystem tag in subject (davem)
18repeat kfree check for peer_random and peer_hmacs (xin)
19
20v2->v3
21net->sctp
22also free peer_chunks
23
24v3->v4
25fix subject tags
26
27v4->v5
28remove cut line
29
30Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
31Reported-by: syzbot+f7e9153b037eac9b1df8@syzkaller.appspotmail.com
32CC: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
33CC: Xin Long <lucien.xin@gmail.com>
34CC: "David S. Miller" <davem@davemloft.net>
35CC: netdev@vger.kernel.org
36Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
37Signed-off-by: David S. Miller <davem@davemloft.net>
38Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
39---
40 net/sctp/sm_make_chunk.c | 8 ++++++++
41 1 file changed, 8 insertions(+)
42
43diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
44index ae65a1cfa596..fb546b2d67ca 100644
45--- a/net/sctp/sm_make_chunk.c
46+++ b/net/sctp/sm_make_chunk.c
47@@ -2600,6 +2600,8 @@ static int sctp_process_param(struct sctp_association *asoc,
48 case SCTP_PARAM_STATE_COOKIE:
49 asoc->peer.cookie_len =
50 ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
51+ if (asoc->peer.cookie)
52+ kfree(asoc->peer.cookie);
53 asoc->peer.cookie = kmemdup(param.cookie->body, asoc->peer.cookie_len, gfp);
54 if (!asoc->peer.cookie)
55 retval = 0;
56@@ -2664,6 +2666,8 @@ static int sctp_process_param(struct sctp_association *asoc,
57 goto fall_through;
58
59 /* Save peer's random parameter */
60+ if (asoc->peer.peer_random)
61+ kfree(asoc->peer.peer_random);
62 asoc->peer.peer_random = kmemdup(param.p,
63 ntohs(param.p->length), gfp);
64 if (!asoc->peer.peer_random) {
65@@ -2677,6 +2681,8 @@ static int sctp_process_param(struct sctp_association *asoc,
66 goto fall_through;
67
68 /* Save peer's HMAC list */
69+ if (asoc->peer.peer_hmacs)
70+ kfree(asoc->peer.peer_hmacs);
71 asoc->peer.peer_hmacs = kmemdup(param.p,
72 ntohs(param.p->length), gfp);
73 if (!asoc->peer.peer_hmacs) {
74@@ -2692,6 +2698,8 @@ static int sctp_process_param(struct sctp_association *asoc,
75 if (!ep->auth_enable)
76 goto fall_through;
77
78+ if (asoc->peer.peer_chunks)
79+ kfree(asoc->peer.peer_chunks);
80 asoc->peer.peer_chunks = kmemdup(param.p,
81 ntohs(param.p->length), gfp);
82 if (!asoc->peer.peer_chunks)
83--
842.20.1
85