| From f82980997895e374dc6b1058a41e4373a3e142d0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 17 Jun 2024 15:13:09 +0300 |
| Subject: fs/ntfs3: Fix field-spanning write in INDEX_HDR |
| |
| From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com> |
| |
| [ Upstream commit 2f3e176fee66ac86ae387787bf06457b101d9f7a ] |
| |
| Fields flags and res[3] replaced with one 4 byte flags. |
| |
| Fixes: 4534a70b7056 ("fs/ntfs3: Add headers and misc files") |
| Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/ntfs3/index.c | 4 ++-- |
| fs/ntfs3/ntfs.h | 9 +++++---- |
| 2 files changed, 7 insertions(+), 6 deletions(-) |
| |
| diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c |
| index a069ae7a748ef..13f492d0d971f 100644 |
| --- a/fs/ntfs3/index.c |
| +++ b/fs/ntfs3/index.c |
| @@ -979,7 +979,7 @@ static struct indx_node *indx_new(struct ntfs_index *indx, |
| hdr->used = |
| cpu_to_le32(eo + sizeof(struct NTFS_DE) + sizeof(u64)); |
| de_set_vbn_le(e, *sub_vbn); |
| - hdr->flags = 1; |
| + hdr->flags = NTFS_INDEX_HDR_HAS_SUBNODES; |
| } else { |
| e->size = cpu_to_le16(sizeof(struct NTFS_DE)); |
| hdr->used = cpu_to_le32(eo + sizeof(struct NTFS_DE)); |
| @@ -1684,7 +1684,7 @@ static int indx_insert_into_root(struct ntfs_index *indx, struct ntfs_inode *ni, |
| e->size = cpu_to_le16(sizeof(struct NTFS_DE) + sizeof(u64)); |
| e->flags = NTFS_IE_HAS_SUBNODES | NTFS_IE_LAST; |
| |
| - hdr->flags = 1; |
| + hdr->flags = NTFS_INDEX_HDR_HAS_SUBNODES; |
| hdr->used = hdr->total = |
| cpu_to_le32(new_root_size - offsetof(struct INDEX_ROOT, ihdr)); |
| |
| diff --git a/fs/ntfs3/ntfs.h b/fs/ntfs3/ntfs.h |
| index b992ec42a1d92..625f2b52bd586 100644 |
| --- a/fs/ntfs3/ntfs.h |
| +++ b/fs/ntfs3/ntfs.h |
| @@ -686,14 +686,15 @@ static inline bool de_has_vcn_ex(const struct NTFS_DE *e) |
| offsetof(struct ATTR_FILE_NAME, name) + \ |
| NTFS_NAME_LEN * sizeof(short), 8) |
| |
| +#define NTFS_INDEX_HDR_HAS_SUBNODES cpu_to_le32(1) |
| + |
| struct INDEX_HDR { |
| __le32 de_off; // 0x00: The offset from the start of this structure |
| // to the first NTFS_DE. |
| __le32 used; // 0x04: The size of this structure plus all |
| // entries (quad-word aligned). |
| __le32 total; // 0x08: The allocated size of for this structure plus all entries. |
| - u8 flags; // 0x0C: 0x00 = Small directory, 0x01 = Large directory. |
| - u8 res[3]; |
| + __le32 flags; // 0x0C: 0x00 = Small directory, 0x01 = Large directory. |
| |
| // |
| // de_off + used <= total |
| @@ -740,7 +741,7 @@ static inline struct NTFS_DE *hdr_next_de(const struct INDEX_HDR *hdr, |
| |
| static inline bool hdr_has_subnode(const struct INDEX_HDR *hdr) |
| { |
| - return hdr->flags & 1; |
| + return hdr->flags & NTFS_INDEX_HDR_HAS_SUBNODES; |
| } |
| |
| struct INDEX_BUFFER { |
| @@ -760,7 +761,7 @@ static inline bool ib_is_empty(const struct INDEX_BUFFER *ib) |
| |
| static inline bool ib_is_leaf(const struct INDEX_BUFFER *ib) |
| { |
| - return !(ib->ihdr.flags & 1); |
| + return !(ib->ihdr.flags & NTFS_INDEX_HDR_HAS_SUBNODES); |
| } |
| |
| /* Index root structure ( 0x90 ). */ |
| -- |
| 2.43.0 |
| |