ntfs: do not dereference a null ctx on error

In ntfs_mft_data_extend_allocation_nolock(), if an error condition occurs
prior to 'ctx' being set to a non-NULL value, avoid dereferencing the NULL
'ctx' pointer in error handling.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Signed-off-by: Danila Chernetsov <listdansp@mail.ru>
Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Danila Chernetsov 2023-05-19 00:21:46 +09:00 committed by Christian Brauner
parent 6405fee9b0
commit aa4b92c523
No known key found for this signature in database
GPG key ID: 91C61BC06578DCA2

View file

@ -1955,36 +1955,38 @@ undo_alloc:
"attribute.%s", es); "attribute.%s", es);
NVolSetErrors(vol); NVolSetErrors(vol);
} }
a = ctx->attr;
if (ntfs_rl_truncate_nolock(vol, &mft_ni->runlist, old_last_vcn)) { if (ntfs_rl_truncate_nolock(vol, &mft_ni->runlist, old_last_vcn)) {
ntfs_error(vol->sb, "Failed to truncate mft data attribute " ntfs_error(vol->sb, "Failed to truncate mft data attribute "
"runlist.%s", es); "runlist.%s", es);
NVolSetErrors(vol); NVolSetErrors(vol);
} }
if (mp_rebuilt && !IS_ERR(ctx->mrec)) { if (ctx) {
if (ntfs_mapping_pairs_build(vol, (u8*)a + le16_to_cpu( a = ctx->attr;
if (mp_rebuilt && !IS_ERR(ctx->mrec)) {
if (ntfs_mapping_pairs_build(vol, (u8 *)a + le16_to_cpu(
a->data.non_resident.mapping_pairs_offset), a->data.non_resident.mapping_pairs_offset),
old_alen - le16_to_cpu( old_alen - le16_to_cpu(
a->data.non_resident.mapping_pairs_offset), a->data.non_resident.mapping_pairs_offset),
rl2, ll, -1, NULL)) { rl2, ll, -1, NULL)) {
ntfs_error(vol->sb, "Failed to restore mapping pairs " ntfs_error(vol->sb, "Failed to restore mapping pairs "
"array.%s", es); "array.%s", es);
NVolSetErrors(vol); NVolSetErrors(vol);
} }
if (ntfs_attr_record_resize(ctx->mrec, a, old_alen)) { if (ntfs_attr_record_resize(ctx->mrec, a, old_alen)) {
ntfs_error(vol->sb, "Failed to restore attribute " ntfs_error(vol->sb, "Failed to restore attribute "
"record.%s", es); "record.%s", es);
NVolSetErrors(vol);
}
flush_dcache_mft_record_page(ctx->ntfs_ino);
mark_mft_record_dirty(ctx->ntfs_ino);
} else if (IS_ERR(ctx->mrec)) {
ntfs_error(vol->sb, "Failed to restore attribute search "
"context.%s", es);
NVolSetErrors(vol); NVolSetErrors(vol);
} }
flush_dcache_mft_record_page(ctx->ntfs_ino);
mark_mft_record_dirty(ctx->ntfs_ino);
} else if (IS_ERR(ctx->mrec)) {
ntfs_error(vol->sb, "Failed to restore attribute search "
"context.%s", es);
NVolSetErrors(vol);
}
if (ctx)
ntfs_attr_put_search_ctx(ctx); ntfs_attr_put_search_ctx(ctx);
}
if (!IS_ERR(mrec)) if (!IS_ERR(mrec))
unmap_mft_record(mft_ni); unmap_mft_record(mft_ni);
up_write(&mft_ni->runlist.lock); up_write(&mft_ni->runlist.lock);