aboutsummaryrefslogtreecommitdiff
path: root/fs/bcachefs/fsck.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-24 22:33:25 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:02 -0400
commite3b4b48c17a0f749f2786e756714a56316a519b3 (patch)
treef84216e87a0c4f0856b8bf794d1ea586066d883f /fs/bcachefs/fsck.c
parentaae15aafcd43ec5346ac6c3f61c09798d26593ee (diff)
bcachefs: Fix a null ptr deref
Fix a few memory safety issues, found by asan in userspace. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/fsck.c')
-rw-r--r--fs/bcachefs/fsck.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c
index 1ce038846476..b867576b3ffd 100644
--- a/fs/bcachefs/fsck.c
+++ b/fs/bcachefs/fsck.c
@@ -290,21 +290,24 @@ static int hash_redo_key(struct btree_trans *trans,
struct bch_hash_info *hash_info,
struct btree_iter *k_iter, struct bkey_s_c k)
{
- struct bkey_i delete;
+ struct bkey_i *delete;
struct bkey_i *tmp;
+ delete = bch2_trans_kmalloc(trans, sizeof(*delete));
+ if (IS_ERR(delete))
+ return PTR_ERR(delete);
+
tmp = bch2_trans_kmalloc(trans, bkey_bytes(k.k));
if (IS_ERR(tmp))
return PTR_ERR(tmp);
bkey_reassemble(tmp, k);
- bkey_init(&delete.k);
- delete.k.p = k_iter->pos;
- bch2_trans_update(trans, k_iter, &delete, 0);
+ bkey_init(&delete->k);
+ delete->k.p = k_iter->pos;
+ bch2_trans_update(trans, k_iter, delete, 0);
- return bch2_hash_set(trans, desc, hash_info, k_iter->pos.inode,
- tmp, 0);
+ return bch2_hash_set(trans, desc, hash_info, k_iter->pos.inode, tmp, 0);
}
static int fsck_hash_delete_at(struct btree_trans *trans,
@@ -377,9 +380,8 @@ static int hash_check_key(struct btree_trans *trans,
return ret;
bad_hash:
if (fsck_err(c, "hash table key at wrong offset: btree %u inode %llu offset %llu, "
- "hashed to %llu should be at %llu\n%s",
- desc.btree_id, hash_k.k->p.inode, hash_k.k->p.offset,
- hash, iter->pos.offset,
+ "hashed to %llu\n%s",
+ desc.btree_id, hash_k.k->p.inode, hash_k.k->p.offset, hash,
(bch2_bkey_val_to_text(&PBUF(buf), c, hash_k), buf)) == FSCK_ERR_IGNORE)
return 0;