sctp: fix error handling on stream scheduler initialization
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>
This commit is contained in:
parent
c8c8218ec5
commit
4d1415811e
|
@ -153,13 +153,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)
|
||||
|
|
Loading…
Reference in New Issue