Message ID | 20221226030605.1437081-1-yukuai1@huaweicloud.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block, bfq: fix uaf for bfqq in bfq_exit_icq_bfqq | expand |
On Mon 26-12-22 11:06:05, Yu Kuai wrote: > From: Yu Kuai <yukuai3@huawei.com> > > Commit 64dc8c732f5c ("block, bfq: fix possible uaf for 'bfqq->bic'") > will access 'bic->bfqq' in bic_set_bfqq(), however, bfq_exit_icq_bfqq() > can free bfqq first, and then call bic_set_bfqq(), which will cause uaf. > > Fix the problem by moving bfq_exit_bfqq() behind bic_set_bfqq(). > > Fixes: 64dc8c732f5c ("block, bfq: fix possible uaf for 'bfqq->bic'") > Reported-by: Yi Zhang <yi.zhang@redhat.com> > Signed-off-by: Yu Kuai <yukuai3@huawei.com> Thanks for the patch! Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > block/bfq-iosched.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c > index 16f43bbc575a..ccf2204477a5 100644 > --- a/block/bfq-iosched.c > +++ b/block/bfq-iosched.c > @@ -5317,8 +5317,8 @@ static void bfq_exit_icq_bfqq(struct bfq_io_cq *bic, bool is_sync) > unsigned long flags; > > spin_lock_irqsave(&bfqd->lock, flags); > - bfq_exit_bfqq(bfqd, bfqq); > bic_set_bfqq(bic, NULL, is_sync); > + bfq_exit_bfqq(bfqd, bfqq); > spin_unlock_irqrestore(&bfqd->lock, flags); > } > } > -- > 2.31.1 >
On Mon, 26 Dec 2022 11:06:05 +0800, Yu Kuai wrote: > Commit 64dc8c732f5c ("block, bfq: fix possible uaf for 'bfqq->bic'") > will access 'bic->bfqq' in bic_set_bfqq(), however, bfq_exit_icq_bfqq() > can free bfqq first, and then call bic_set_bfqq(), which will cause uaf. > > Fix the problem by moving bfq_exit_bfqq() behind bic_set_bfqq(). > > > [...] Applied, thanks! [1/1] block, bfq: fix uaf for bfqq in bfq_exit_icq_bfqq commit: 246cf66e300b76099b5dbd3fdd39e9a5dbc53f02 Best regards,
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index 16f43bbc575a..ccf2204477a5 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c @@ -5317,8 +5317,8 @@ static void bfq_exit_icq_bfqq(struct bfq_io_cq *bic, bool is_sync) unsigned long flags; spin_lock_irqsave(&bfqd->lock, flags); - bfq_exit_bfqq(bfqd, bfqq); bic_set_bfqq(bic, NULL, is_sync); + bfq_exit_bfqq(bfqd, bfqq); spin_unlock_irqrestore(&bfqd->lock, flags); } }