mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
sctp: fix error handling on stream scheduler initialization
[ Upstream commit4d1415811e] It allocates the extended area for outbound streams only on sendmsg calls, if they are not yet allocated. When using the priority stream scheduler, this initialization may imply into a subsequent allocation, which may fail. In this case, it was aborting the stream scheduler initialization but leaving the ->ext pointer (allocated) in there, thus in a partially initialized state. On a subsequent call to sendmsg, it would notice the ->ext pointer in there, and trip on uninitialized stuff when trying to schedule the data chunk. The fix is undo the ->ext initialization if the stream scheduler initialization fails and avoid the partially initialized state. Although syzkaller bisected this to commit4ff40b8626("sctp: set chunk transport correctly when it's a new asoc"), this bug was actually introduced on the commit I marked below. Reported-by: syzbot+c1a380d42b190ad1e559@syzkaller.appspotmail.com Fixes:5bbbbe32a4("sctp: introduce stream scheduler foundations") Tested-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Acked-by: Neil Horman <nhorman@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
bfa7913575
commit
d9ee5afd91
@@ -253,13 +253,20 @@ out:
|
||||
int sctp_stream_init_ext(struct sctp_stream *stream, __u16 sid)
|
||||
{
|
||||
struct sctp_stream_out_ext *soute;
|
||||
int ret;
|
||||
|
||||
soute = kzalloc(sizeof(*soute), GFP_KERNEL);
|
||||
if (!soute)
|
||||
return -ENOMEM;
|
||||
SCTP_SO(stream, sid)->ext = soute;
|
||||
|
||||
return sctp_sched_init_sid(stream, sid, GFP_KERNEL);
|
||||
ret = sctp_sched_init_sid(stream, sid, GFP_KERNEL);
|
||||
if (ret) {
|
||||
kfree(SCTP_SO(stream, sid)->ext);
|
||||
SCTP_SO(stream, sid)->ext = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void sctp_stream_free(struct sctp_stream *stream)
|
||||
|
||||
Reference in New Issue
Block a user