]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.19.54/sctp-free-cookie-before-we-memdup-a-new-one.patch
5.1-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.19.54 / sctp-free-cookie-before-we-memdup-a-new-one.patch
CommitLineData
cc95841f
GKH
1From foo@baz Wed 19 Jun 2019 02:34:37 PM CEST
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
6From: Neil Horman <nhorman@tuxdriver.com>
7
8[ Upstream commit ce950f1050cece5e406a5cde723c69bba60e1b26 ]
9
10Based on comments from Xin, even after fixes for our recent syzbot
11report of cookie memory leaks, its possible to get a resend of an INIT
12chunk which would lead to us leaking cookie memory.
13
14To ensure that we don't leak cookie memory, free any previously
15allocated cookie first.
16
17Change notes
18v1->v2
19update subsystem tag in subject (davem)
20repeat kfree check for peer_random and peer_hmacs (xin)
21
22v2->v3
23net->sctp
24also free peer_chunks
25
26v3->v4
27fix subject tags
28
29v4->v5
30remove cut line
31
32Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
33Reported-by: syzbot+f7e9153b037eac9b1df8@syzkaller.appspotmail.com
34CC: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
35CC: Xin Long <lucien.xin@gmail.com>
36CC: "David S. Miller" <davem@davemloft.net>
37CC: netdev@vger.kernel.org
38Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
39Signed-off-by: David S. Miller <davem@davemloft.net>
40Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
41---
42 net/sctp/sm_make_chunk.c | 8 ++++++++
43 1 file changed, 8 insertions(+)
44
45--- a/net/sctp/sm_make_chunk.c
46+++ b/net/sctp/sm_make_chunk.c
47@@ -2600,6 +2600,8 @@ do_addr_param:
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 @@ do_addr_param:
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 @@ do_addr_param:
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 @@ do_addr_param:
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)