Unverified Commit 2f3e176f authored by Konstantin Komarov's avatar Konstantin Komarov
Browse files

fs/ntfs3: Fix field-spanning write in INDEX_HDR



Fields flags and res[3] replaced with one 4 byte flags.

Fixes: 4534a70b ("fs/ntfs3: Add headers and misc files")
Signed-off-by: default avatarKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
parent c091354d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -978,7 +978,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));
@@ -1683,7 +1683,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));

+5 −4
Original line number Diff line number Diff line
@@ -693,14 +693,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
@@ -748,7 +749,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 {
@@ -768,7 +769,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 ). */