bcachefs: fix uaf in bch2_dio_write_done()
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 12 Oct 2024 19:38:33 +0000 (15:38 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 13 Oct 2024 21:55:33 +0000 (17:55 -0400)
Reported-by: syzbot+19ad84d5133871207377@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io-direct.c

index ee1c032..6d3a05a 100644 (file)
@@ -369,6 +369,7 @@ static noinline void bch2_dio_write_flush(struct dio_write *dio)
 
 static __always_inline long bch2_dio_write_done(struct dio_write *dio)
 {
+       struct bch_fs *c = dio->op.c;
        struct kiocb *req = dio->req;
        struct bch_inode_info *inode = dio->inode;
        bool sync = dio->sync;
@@ -387,7 +388,7 @@ static __always_inline long bch2_dio_write_done(struct dio_write *dio)
        ret = dio->op.error ?: ((long) dio->written << 9);
        bio_put(&dio->op.wbio.bio);
 
-       bch2_write_ref_put(dio->op.c, BCH_WRITE_REF_dio_write);
+       bch2_write_ref_put(c, BCH_WRITE_REF_dio_write);
 
        /* inode->i_dio_count is our ref on inode and thus bch_fs */
        inode_dio_end(&inode->v);