Blame SOURCES/0092-fs-ntfs3-Refactoring-of-ntfs_set_ea.patch

Kmods SIG 63c143
From cff32466bf851bf29cd491d8a3cbeb4dc4a36ab6 Mon Sep 17 00:00:00 2001
Kmods SIG 63c143
From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG 63c143
Date: Fri, 24 Sep 2021 17:53:56 +0300
Kmods SIG 63c143
Subject: [Backport cff32466bf85] src: Refactoring of ntfs_set_ea
Kmods SIG 63c143
Kmods SIG 63c143
Make code more readable.
Kmods SIG 63c143
Don't try to read zero bytes.
Kmods SIG 63c143
Add warning when size of exteneded attribute exceeds limit.
Kmods SIG 63c143
Kmods SIG 63c143
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG 63c143
---
Kmods SIG 63c143
 src/xattr.c | 31 +++++++++++++++++--------------
Kmods SIG 63c143
 1 file changed, 17 insertions(+), 14 deletions(-)
Kmods SIG 63c143
Kmods SIG 63c143
diff --git a/src/xattr.c b/src/xattr.c
Kmods SIG 63c143
index 29f571b53083ea86d3091834749b8d87dec9d69c..cdc01877227a509398c9c8b203382ac2f9858a5e 100644
Kmods SIG 63c143
--- a/src/xattr.c
Kmods SIG 63c143
+++ b/src/xattr.c
Kmods SIG 63c143
@@ -75,6 +75,7 @@ static int ntfs_read_ea(struct ntfs_inode *ni, struct EA_FULL **ea,
Kmods SIG 63c143
 			size_t add_bytes, const struct EA_INFO **info)
Kmods SIG 63c143
 {
Kmods SIG 63c143
 	int err;
Kmods SIG 63c143
+	struct ntfs_sb_info *sbi = ni->mi.sbi;
Kmods SIG 63c143
 	struct ATTR_LIST_ENTRY *le = NULL;
Kmods SIG 63c143
 	struct ATTRIB *attr_info, *attr_ea;
Kmods SIG 63c143
 	void *ea_p;
Kmods SIG 63c143
@@ -99,10 +100,10 @@ static int ntfs_read_ea(struct ntfs_inode *ni, struct EA_FULL **ea,
Kmods SIG 63c143
 
Kmods SIG 63c143
 	/* Check Ea limit. */
Kmods SIG 63c143
 	size = le32_to_cpu((*info)->size);
Kmods SIG 63c143
-	if (size > ni->mi.sbi->ea_max_size)
Kmods SIG 63c143
+	if (size > sbi->ea_max_size)
Kmods SIG 63c143
 		return -EFBIG;
Kmods SIG 63c143
 
Kmods SIG 63c143
-	if (attr_size(attr_ea) > ni->mi.sbi->ea_max_size)
Kmods SIG 63c143
+	if (attr_size(attr_ea) > sbi->ea_max_size)
Kmods SIG 63c143
 		return -EFBIG;
Kmods SIG 63c143
 
Kmods SIG 63c143
 	/* Allocate memory for packed Ea. */
Kmods SIG 63c143
@@ -110,15 +111,16 @@ static int ntfs_read_ea(struct ntfs_inode *ni, struct EA_FULL **ea,
Kmods SIG 63c143
 	if (!ea_p)
Kmods SIG 63c143
 		return -ENOMEM;
Kmods SIG 63c143
 
Kmods SIG 63c143
-	if (attr_ea->non_res) {
Kmods SIG 63c143
+	if (!size) {
Kmods SIG 63c143
+		;
Kmods SIG 63c143
+	} else if (attr_ea->non_res) {
Kmods SIG 63c143
 		struct runs_tree run;
Kmods SIG 63c143
 
Kmods SIG 63c143
 		run_init(&run;;
Kmods SIG 63c143
 
Kmods SIG 63c143
 		err = attr_load_runs(attr_ea, ni, &run, NULL);
Kmods SIG 63c143
 		if (!err)
Kmods SIG 63c143
-			err = ntfs_read_run_nb(ni->mi.sbi, &run, 0, ea_p, size,
Kmods SIG 63c143
-					       NULL);
Kmods SIG 63c143
+			err = ntfs_read_run_nb(sbi, &run, 0, ea_p, size, NULL);
Kmods SIG 63c143
 		run_close(&run;;
Kmods SIG 63c143
 
Kmods SIG 63c143
 		if (err)
Kmods SIG 63c143
@@ -366,21 +368,22 @@ static noinline int ntfs_set_ea(struct inode *inode, const char *name,
Kmods SIG 63c143
 	new_ea->name[name_len] = 0;
Kmods SIG 63c143
 	memcpy(new_ea->name + name_len + 1, value, val_size);
Kmods SIG 63c143
 	new_pack = le16_to_cpu(ea_info.size_pack) + packed_ea_size(new_ea);
Kmods SIG 63c143
-
Kmods SIG 63c143
-	/* Should fit into 16 bits. */
Kmods SIG 63c143
-	if (new_pack > 0xffff) {
Kmods SIG 63c143
-		err = -EFBIG; // -EINVAL?
Kmods SIG 63c143
-		goto out;
Kmods SIG 63c143
-	}
Kmods SIG 63c143
 	ea_info.size_pack = cpu_to_le16(new_pack);
Kmods SIG 63c143
-
Kmods SIG 63c143
 	/* New size of ATTR_EA. */
Kmods SIG 63c143
 	size += add;
Kmods SIG 63c143
-	if (size > sbi->ea_max_size) {
Kmods SIG 63c143
+	ea_info.size = cpu_to_le32(size);
Kmods SIG 63c143
+
Kmods SIG 63c143
+	/*
Kmods SIG 63c143
+	 * 1. Check ea_info.size_pack for overflow.
Kmods SIG 63c143
+	 * 2. New attibute size must fit value from $AttrDef
Kmods SIG 63c143
+	 */
Kmods SIG 63c143
+	if (new_pack > 0xffff || size > sbi->ea_max_size) {
Kmods SIG 63c143
+		ntfs_inode_warn(
Kmods SIG 63c143
+			inode,
Kmods SIG 63c143
+			"The size of extended attributes must not exceed 64KiB");
Kmods SIG 63c143
 		err = -EFBIG; // -EINVAL?
Kmods SIG 63c143
 		goto out;
Kmods SIG 63c143
 	}
Kmods SIG 63c143
-	ea_info.size = cpu_to_le32(size);
Kmods SIG 63c143
 
Kmods SIG 63c143
 update_ea:
Kmods SIG 63c143
 
Kmods SIG 63c143
-- 
Kmods SIG 63c143
2.31.1
Kmods SIG 63c143