Re: memory leak in sctp_stream_init
From: Neil Horman <nhorman@tuxdriver.com>
Date: 2019-12-17 11:54:13
Also in:
linux-sctp, lkml
On Mon, Dec 16, 2019 at 09:37:16PM -0300, Marcelo Ricardo Leitner wrote:
quoted hunk ↗ jump to hunk
On Mon, Dec 16, 2019 at 11:56:38AM -0300, Marcelo Ricardo Leitner wrote: ...quoted
Considering that genradix_prealloc() failure is not fatal, seems the fix here is to just ignore the failure in sctp_stream_alloc_out() and let genradix try again later on.Better yet, this fixes it here: ---8<---diff --git a/net/sctp/stream.c b/net/sctp/stream.c index df60b5ef24cb..e0b01bf912b3 100644 --- a/net/sctp/stream.c +++ b/net/sctp/stream.c@@ -84,8 +84,10 @@ static int sctp_stream_alloc_out(struct sctp_stream *stream, __u16 outcnt, return 0; ret = genradix_prealloc(&stream->out, outcnt, gfp); - if (ret) + if (ret) { + genradix_free(&stream->out); return ret; + } stream->outcnt = outcnt; return 0;@@ -100,8 +102,10 @@ static int sctp_stream_alloc_in(struct sctp_stream *stream, __u16 incnt, return 0; ret = genradix_prealloc(&stream->in, incnt, gfp); - if (ret) + if (ret) { + genradix_free(&stream->in); return ret; + } stream->incnt = incnt; return 0;
I get how that fixes this, but that doesn't really seem like the right fix in my mind. Shouldn't genradix_prealloc internally free any memory its allocated if it fails part way through its operation? Neil