From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C15635E1B6; Fri, 17 Jul 2026 03:40:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259624; cv=none; b=g8D8B/Q3zUlDWUssuf+l+6lg4jG2CChb+lp4iPuhsl3bpBJCrlN9yYI9fQUlbxxnpYZWYq7gdYQKcClMT8P9EIvpphksrraNKJBi8/2XkH/tvIgaxmXiUXwc/iYR7Ij1e2s/DvZjykyV25l+xvxmjeChlqZPHwfqQ+b9MX/D7Fo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259624; c=relaxed/simple; bh=40tQVUGguIMo+rYrW6EopcfqeMB8VsaWYVsx+ZaaH0E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EWpEPygQ6joaaTJjE8KxVRw7lebqylUhasAcmuZZcHJyqu22XFyChhqV0gtfQQ24wKZc/lFMiGxBtaLZYIsGhS4baaXk9MGp64Ml4Im7F8VcbBHQm9uE6CZlrkfeQ9Wl6KorNpDaOwhAjWXEvUndS6tBEeyDcz30/JwDHVMkYi0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 3631c324819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:cc988db7-5a3e-4162-8937-0ed8dad00081,IP:10, URL:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:5 X-CID-INFO: VERSION:1.3.12,REQID:cc988db7-5a3e-4162-8937-0ed8dad00081,IP:10,UR L:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:5 X-CID-META: VersionHash:e7bac3a,CLOUDID:fef1a97aa70561e02a143726fc1c0fa0,BulkI D:260717114012IGR8LSBE,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 3631c324819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1188837533; Fri, 17 Jul 2026 11:40:10 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 1/9] smb: client: support security.capability over EAs Date: Fri, 17 Jul 2026 11:39:19 +0800 Message-ID: <03e3fb98415d9e861588b165d78a22f18e14eb9c.1784258165.git.tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses setcap and getcap to check that a write clears the file capability. The CIFS client does not have a security xattr handler, so these commands cannot set or read security.capability through SMB EAs. Register a security xattr handler and build the complete EA name for SET_INFO and QUERY_INFO. Keep security.capability unchanged in EA lists. Reject other security xattrs. Signed-off-by: Ze Tan --- fs/smb/client/smb2ops.c | 26 ++++++++++++--- fs/smb/client/xattr.c | 70 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 9 deletions(-) diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index cbd51a08e97e..320742ec3ed8 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "cifsfs.h" #include "cifsglob.h" @@ -1043,6 +1044,15 @@ static int smb2_query_file_info(const unsigned int x= id, struct cifs_tcon *tcon, } =20 #ifdef CONFIG_CIFS_XATTR +static bool cifs_passthrough(const char *name, size_t name_len) +{ + if (name_len =3D=3D sizeof(XATTR_NAME_CAPS) - 1 && + !memcmp(name, XATTR_NAME_CAPS, name_len)) + return true; + + return false; +} + static ssize_t move_smb2_ea_to_cifs(char *dst, size_t dst_size, struct smb2_file_full_ea_info *src, size_t src_size, @@ -1085,16 +1095,24 @@ move_smb2_ea_to_cifs(char *dst, size_t dst_size, goto out; } } else { - /* 'user.' plus a terminating null */ - user_name_len =3D 5 + 1 + name_len; + bool passthrough_name; + + passthrough_name =3D cifs_passthrough(name, name_len); + if (passthrough_name) + user_name_len =3D name_len + 1; + else + /* 'user.' plus a terminating null */ + user_name_len =3D 5 + 1 + name_len; =20 if (buf_size =3D=3D 0) { /* skip copy - calc size only */ rc +=3D user_name_len; } else if (dst_size >=3D user_name_len) { dst_size -=3D user_name_len; - memcpy(dst, "user.", 5); - dst +=3D 5; + if (!passthrough_name) { + memcpy(dst, "user.", 5); + dst +=3D 5; + } memcpy(dst, src->ea_data, name_len); dst +=3D name_len; *dst =3D 0; diff --git a/fs/smb/client/xattr.c b/fs/smb/client/xattr.c index 5091f6c0d7fe..8fa40593bc93 100644 --- a/fs/smb/client/xattr.c +++ b/fs/smb/client/xattr.c @@ -36,12 +36,38 @@ #define SMB3_XATTR_CIFS_NTSD_FULL "system.smb3_ntsd_full" /* owner/DACL/SA= CL */ #define SMB3_XATTR_ATTRIB "smb3.dosattrib" /* full name: user.smb3.dosatt= rib */ #define SMB3_XATTR_CREATETIME "smb3.creationtime" /* user.smb3.creationti= me */ -/* BB need to add server (Samba e.g) support for security and trusted pref= ix */ - -enum { XATTR_USER, XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT, +enum { XATTR_USER, XATTR_SECURITY, + XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT, XATTR_CIFS_NTSD_SACL, XATTR_CIFS_NTSD_OWNER, XATTR_CIFS_NTSD, XATTR_CIFS_NTSD_FULL }; =20 +static int cifs_build_ea_name(int xattr_flag, const char *name, char *ea_n= ame, + size_t ea_name_size) +{ + size_t name_len; + + switch (xattr_flag) { + case XATTR_SECURITY: + /* + * Only security.capability has native Linux security xattr + * semantics on POSIX-capable servers. + */ + if (strcmp(name, XATTR_CAPS_SUFFIX)) + return -EOPNOTSUPP; + name_len =3D strlen(name); + if (ea_name_size <=3D XATTR_SECURITY_PREFIX_LEN || + name_len > ea_name_size - XATTR_SECURITY_PREFIX_LEN - 1) + return -ERANGE; + memcpy(ea_name, XATTR_SECURITY_PREFIX, + XATTR_SECURITY_PREFIX_LEN); + memcpy(ea_name + XATTR_SECURITY_PREFIX_LEN, name, + name_len + 1); + return XATTR_SECURITY_PREFIX_LEN + name_len; + default: + return -EOPNOTSUPP; + } +} + static int cifs_attrib_set(unsigned int xid, struct cifs_tcon *pTcon, struct inode *inode, const char *full_path, const void *value, size_t size) @@ -104,6 +130,8 @@ static int cifs_xattr_set(const struct xattr_handler *h= andler, struct cifs_tcon *pTcon; const char *full_path; void *page; + char ea_name[XATTR_NAME_MAX + 1]; + const char *server_ea_name =3D name; =20 tlink =3D cifs_sb_tlink(cifs_sb); if (IS_ERR(tlink)) @@ -131,6 +159,16 @@ static int cifs_xattr_set(const struct xattr_handler *= handler, } =20 switch (handler->flags) { + case XATTR_SECURITY: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: setting security xattr %s\n", + __func__, name); + goto set_ea; + case XATTR_USER: cifs_dbg(FYI, "%s:setting user xattr %s\n", __func__, name); if ((strcmp(name, CIFS_XATTR_ATTRIB) =3D=3D 0) || @@ -149,12 +187,13 @@ static int cifs_xattr_set(const struct xattr_handler = *handler, break; } =20 +set_ea: if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NO_XATTR) goto out; =20 if (pTcon->ses->server->ops->set_EA) { rc =3D pTcon->ses->server->ops->set_EA(xid, pTcon, - full_path, name, value, (__u16)size, + full_path, server_ea_name, value, (__u16)size, cifs_sb->local_nls, cifs_sb); if (rc =3D=3D 0) inode_set_ctime_current(inode); @@ -280,6 +319,8 @@ static int cifs_xattr_get(const struct xattr_handler *h= andler, struct cifs_tcon *pTcon; const char *full_path; void *page; + char ea_name[XATTR_NAME_MAX + 1]; + const char *server_ea_name =3D name; =20 tlink =3D cifs_sb_tlink(cifs_sb); if (IS_ERR(tlink)) @@ -297,6 +338,16 @@ static int cifs_xattr_get(const struct xattr_handler *= handler, =20 /* return alt name if available as pseudo attr */ switch (handler->flags) { + case XATTR_SECURITY: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: querying security xattr %s\n", + __func__, name); + goto query_ea; + case XATTR_USER: cifs_dbg(FYI, "%s:querying user xattr %s\n", __func__, name); if ((strcmp(name, CIFS_XATTR_ATTRIB) =3D=3D 0) || @@ -309,12 +360,13 @@ static int cifs_xattr_get(const struct xattr_handler = *handler, break; } =20 +query_ea: if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NO_XATTR) goto out; =20 if (pTcon->ses->server->ops->query_all_EAs) rc =3D pTcon->ses->server->ops->query_all_EAs(xid, pTcon, - full_path, name, value, size, cifs_sb); + full_path, server_ea_name, value, size, cifs_sb); break; =20 case XATTR_CIFS_ACL: @@ -438,6 +490,13 @@ static const struct xattr_handler cifs_user_xattr_hand= ler =3D { .set =3D cifs_xattr_set, }; =20 +static const struct xattr_handler cifs_security_xattr_handler =3D { + .prefix =3D XATTR_SECURITY_PREFIX, + .flags =3D XATTR_SECURITY, + .get =3D cifs_xattr_get, + .set =3D cifs_xattr_set, +}; + /* os2.* attributes are treated like user.* attributes */ static const struct xattr_handler cifs_os2_xattr_handler =3D { .prefix =3D XATTR_OS2_PREFIX, @@ -522,6 +581,7 @@ static const struct xattr_handler smb3_ntsd_full_xattr_= handler =3D { =20 const struct xattr_handler * const cifs_xattr_handlers[] =3D { &cifs_user_xattr_handler, + &cifs_security_xattr_handler, &cifs_os2_xattr_handler, &cifs_cifs_acl_xattr_handler, &smb3_acl_xattr_handler, /* alias for above since avoiding "cifs" */ --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C4819366546; Fri, 17 Jul 2026 03:40:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259620; cv=none; b=Ueqh9cmAtk8Axy3HStJkMYHUCr77dHjtMaKcjDabxSAo3zVjG4m4PAQK+J4X7ykYrBop32CSY7LD8XU/i2+tpqupQjQj5IfpW130OF5HcxqCUzL5/mZPYn8TiWoxXGYepWln/3f8/j1QCb+niyTXaX6aYpoI1Nj3lUOaxLsoBGk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259620; c=relaxed/simple; bh=nXBdRjbaI9gRFhKJhB2YAOMV2Zr9IovA+yBBL5HhhUA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fTv3xTHVouGquEK653UJmzd1nFlRzA2/U5qGus0GzwYOucABEQuErHVEktIEsEcSESyiaKQt2I5jXzFkVHmvAdAaeCaRrQwdpVJxfRQ8vKRMfnqv4D09u04cRsleD4kFujxq3UxW04G4F0EqxghKkERg6o6XoTnjcZ5HwS67qBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 36770c0e819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:7601579a-c055-4d07-9f4a-c4c2178ff5bf,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:7601579a-c055-4d07-9f4a-c4c2178ff5bf,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:0236b6c31d5989cde7818ff7bc1f5005,BulkI D:260717114011SLZ3X0PY,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 36770c0e819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 385014376; Fri, 17 Jul 2026 11:40:10 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 2/9] smb: client: support security.xfstests over EAs Date: Fri, 17 Jul 2026 11:39:20 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before checking file capabilities, generic/093 calls _require_attrs security. This helper runs "setfattr -n security.xfstests" to check the security xattr namespace. The security handler supports only security.capability, so this command returns "Operation not supported". Add security.xfstests as another exact security EA name. Keep this name unchanged in EA lists. Continue to reject other security xattrs. Signed-off-by: Ze Tan --- fs/smb/client/smb2ops.c | 4 ++++ fs/smb/client/xattr.c | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 320742ec3ed8..9638fdad93cc 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -1050,6 +1050,10 @@ static bool cifs_passthrough(const char *name, size_= t name_len) !memcmp(name, XATTR_NAME_CAPS, name_len)) return true; =20 + if (name_len =3D=3D sizeof(XATTR_SECURITY_PREFIX "xfstests") - 1 && + !memcmp(name, XATTR_SECURITY_PREFIX "xfstests", name_len)) + return true; + return false; } =20 diff --git a/fs/smb/client/xattr.c b/fs/smb/client/xattr.c index 8fa40593bc93..42db6920901e 100644 --- a/fs/smb/client/xattr.c +++ b/fs/smb/client/xattr.c @@ -49,10 +49,11 @@ static int cifs_build_ea_name(int xattr_flag, const cha= r *name, char *ea_name, switch (xattr_flag) { case XATTR_SECURITY: /* - * Only security.capability has native Linux security xattr - * semantics on POSIX-capable servers. + * Only security.capability and the xfstests security namespace + * probe are supported on POSIX-capable servers. */ - if (strcmp(name, XATTR_CAPS_SUFFIX)) + if (strcmp(name, XATTR_CAPS_SUFFIX) && + strcmp(name, "xfstests")) return -EOPNOTSUPP; name_len =3D strlen(name); if (ea_name_size <=3D XATTR_SECURITY_PREFIX_LEN || --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD0A3336885; Fri, 17 Jul 2026 03:40:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259621; cv=none; b=tD+jik+pLW/8cPZ2n1loO91NJBIPK97Z4icqEHCyZ6cE/HCxInzv368kDEeNSUQTI4+fVuk8qiB/TTUmXxgs8CBd26Tb9+91lTih3cIH8b9BZumS/EiFMHiAd/7ovU2MmY5puvShoXFtEH0GAnZqBkbC3lQHCYIsz+EPhY/rDyU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259621; c=relaxed/simple; bh=lM1MSQ5L02emZtiqItD1xTXqMgay7VhVfxmkufp3YDQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fbwXlnmCFiwFedAwYao9dAciaWktOP5HYCH78MoV/suk9sFRow8JTHvHz8qbgsIBMbkxA6+PPfeXqHbikJZe71dJ2LBroj/riyAEnp+VvCbuZLZaCMDYSjADJG6evV6KMgBmKSKbcGr6jiFJ5VDwgXw9O9Gn3A/MbV0S/84hHNU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 36bc0f52819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:ded62745-69b6-4883-ab40-dc04ca609f8a,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:ded62745-69b6-4883-ab40-dc04ca609f8a,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:a9776d581f648ce9a76f91ba9cc687bf,BulkI D:260717114011CVIIBNWL,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 36bc0f52819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 656593735; Fri, 17 Jul 2026 11:40:11 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 3/9] smb: client: support trusted xattrs over EAs Date: Fri, 17 Jul 2026 11:39:21 +0800 Message-ID: <3d7836d5df4b9e65e834caf6f1ba3f1aa1bc59fd.1784258165.git.tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses setfattr and getfattr to check that a write does not clear trusted.name. The CIFS client does not have a trusted xattr handler, so these commands cannot set or read trusted xattrs through SMB EAs. Register a trusted xattr handler and build the complete trusted EA name for SET_INFO and QUERY_INFO. Keep the trusted prefix in EA lists. Signed-off-by: Ze Tan --- fs/smb/client/smb2ops.c | 4 ++++ fs/smb/client/xattr.c | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c index 9638fdad93cc..c3a18fafbfa0 100644 --- a/fs/smb/client/smb2ops.c +++ b/fs/smb/client/smb2ops.c @@ -1046,6 +1046,10 @@ static int smb2_query_file_info(const unsigned int x= id, struct cifs_tcon *tcon, #ifdef CONFIG_CIFS_XATTR static bool cifs_passthrough(const char *name, size_t name_len) { + if (name_len > XATTR_TRUSTED_PREFIX_LEN && + !memcmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) + return true; + if (name_len =3D=3D sizeof(XATTR_NAME_CAPS) - 1 && !memcmp(name, XATTR_NAME_CAPS, name_len)) return true; diff --git a/fs/smb/client/xattr.c b/fs/smb/client/xattr.c index 42db6920901e..3dae8b23aca7 100644 --- a/fs/smb/client/xattr.c +++ b/fs/smb/client/xattr.c @@ -36,7 +36,7 @@ #define SMB3_XATTR_CIFS_NTSD_FULL "system.smb3_ntsd_full" /* owner/DACL/SA= CL */ #define SMB3_XATTR_ATTRIB "smb3.dosattrib" /* full name: user.smb3.dosatt= rib */ #define SMB3_XATTR_CREATETIME "smb3.creationtime" /* user.smb3.creationti= me */ -enum { XATTR_USER, XATTR_SECURITY, +enum { XATTR_USER, XATTR_TRUSTED, XATTR_SECURITY, XATTR_CIFS_ACL, XATTR_ACL_ACCESS, XATTR_ACL_DEFAULT, XATTR_CIFS_NTSD_SACL, XATTR_CIFS_NTSD_OWNER, XATTR_CIFS_NTSD, XATTR_CIFS_NTSD_FULL }; @@ -64,6 +64,16 @@ static int cifs_build_ea_name(int xattr_flag, const char= *name, char *ea_name, memcpy(ea_name + XATTR_SECURITY_PREFIX_LEN, name, name_len + 1); return XATTR_SECURITY_PREFIX_LEN + name_len; + case XATTR_TRUSTED: + name_len =3D strlen(name); + if (ea_name_size <=3D XATTR_TRUSTED_PREFIX_LEN || + name_len > ea_name_size - XATTR_TRUSTED_PREFIX_LEN - 1) + return -ERANGE; + memcpy(ea_name, XATTR_TRUSTED_PREFIX, + XATTR_TRUSTED_PREFIX_LEN); + memcpy(ea_name + XATTR_TRUSTED_PREFIX_LEN, name, + name_len + 1); + return XATTR_TRUSTED_PREFIX_LEN + name_len; default: return -EOPNOTSUPP; } @@ -160,6 +170,16 @@ static int cifs_xattr_set(const struct xattr_handler *= handler, } =20 switch (handler->flags) { + case XATTR_TRUSTED: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: setting trusted xattr %s\n", + __func__, name); + goto set_ea; + case XATTR_SECURITY: rc =3D cifs_build_ea_name(handler->flags, name, ea_name, sizeof(ea_name)); @@ -339,6 +359,16 @@ static int cifs_xattr_get(const struct xattr_handler *= handler, =20 /* return alt name if available as pseudo attr */ switch (handler->flags) { + case XATTR_TRUSTED: + rc =3D cifs_build_ea_name(handler->flags, name, ea_name, + sizeof(ea_name)); + if (rc < 0) + goto out; + server_ea_name =3D ea_name; + cifs_dbg(FYI, "%s: querying trusted xattr %s\n", + __func__, name); + goto query_ea; + case XATTR_SECURITY: rc =3D cifs_build_ea_name(handler->flags, name, ea_name, sizeof(ea_name)); @@ -491,6 +521,13 @@ static const struct xattr_handler cifs_user_xattr_hand= ler =3D { .set =3D cifs_xattr_set, }; =20 +static const struct xattr_handler cifs_trusted_xattr_handler =3D { + .prefix =3D XATTR_TRUSTED_PREFIX, + .flags =3D XATTR_TRUSTED, + .get =3D cifs_xattr_get, + .set =3D cifs_xattr_set, +}; + static const struct xattr_handler cifs_security_xattr_handler =3D { .prefix =3D XATTR_SECURITY_PREFIX, .flags =3D XATTR_SECURITY, @@ -582,6 +619,7 @@ static const struct xattr_handler smb3_ntsd_full_xattr_= handler =3D { =20 const struct xattr_handler * const cifs_xattr_handlers[] =3D { &cifs_user_xattr_handler, + &cifs_trusted_xattr_handler, &cifs_security_xattr_handler, &cifs_os2_xattr_handler, &cifs_cifs_acl_xattr_handler, --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E15CE37A826; Fri, 17 Jul 2026 03:40:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259622; cv=none; b=mFVlCGxtIkiC76xpb5TvT2HjldNHgL/ybc6vmgznCeLI94Z2D5md4F18Os8fdU7H6Q1DehO3+g+wsfPX0OPOc9LudutnhGdQVXQJYEGwUvGeKw+hC34XCWUV0P8bHfmxefZNeHgW79Qf8TWgJIZxkBEc6hXmTpBIy3rR9ic1or0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259622; c=relaxed/simple; bh=JZ99owPIk1R993ZTs7gkcuK9kecx7wMozlLeaeVjx+A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=keWbGHVi0k+NCq9VNg5gKKb6n7Nq0i53/AYRdGj21JsWKTEWKl4rCGX5kmLTvdNIPWeFsQslNtQxTIOuDF21Hha0m7S6VTqPsaUfn70nrqZ6Pk6UKGnde84+NySsuBZAOXkQ18ScTlZ9rTbJB/SJLkB/2geEe9eU4mz2KpsMi3A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 3702ae12819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:827a2fa4-d77f-49f2-9125-f39c5a65b292,IP:10, URL:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:5 X-CID-INFO: VERSION:1.3.12,REQID:827a2fa4-d77f-49f2-9125-f39c5a65b292,IP:10,UR L:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:5 X-CID-META: VersionHash:e7bac3a,CLOUDID:50d958c8e477cc9271204cd5095665ed,BulkI D:260717114014LEEY44NE,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,Bulk: nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,B RE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 3702ae12819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 534809498; Fri, 17 Jul 2026 11:40:11 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 4/9] ksmbd: extract SMB EA backing xattr name mapping Date: Fri, 17 Jul 2026 11:39:22 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" smb2_set_ea() directly adds the user prefix when it builds the backing xattr name. This mixes name conversion with the set operation. Extract ksmbd_map_ea_name_to_xattr() and keep the existing behavior unchanged. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index b73167785e87..dad3427a584e 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2643,6 +2643,18 @@ static noinline int create_smb2_pipe(struct ksmbd_wo= rk *work) return err; } =20 +static int ksmbd_map_ea_name_to_xattr(const char *ea_name, + size_t ea_name_len, char *attr_name) +{ + if (ea_name_len > XATTR_NAME_MAX - XATTR_USER_PREFIX_LEN) + return -EINVAL; + + memcpy(attr_name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); + memcpy(&attr_name[XATTR_USER_PREFIX_LEN], ea_name, ea_name_len); + attr_name[XATTR_USER_PREFIX_LEN + ea_name_len] =3D '\0'; + return XATTR_USER_PREFIX_LEN + ea_name_len; +} + /** * smb2_set_ea() - handler for setting extended attributes using set * info command @@ -2658,7 +2670,7 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, un= signed int buf_len, { struct mnt_idmap *idmap =3D mnt_idmap(path->mnt); char *attr_name =3D NULL, *value; - int rc =3D 0; + int rc =3D 0, attr_name_len; unsigned int next =3D 0; =20 if (buf_len < sizeof(struct smb2_ea_info) + eabuf->EaNameLength + 1 + @@ -2679,24 +2691,21 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, = unsigned int buf_len, le16_to_cpu(eabuf->EaValueLength), le32_to_cpu(eabuf->NextEntryOffset)); =20 - if (eabuf->EaNameLength > - (XATTR_NAME_MAX - XATTR_USER_PREFIX_LEN)) { + attr_name_len =3D ksmbd_map_ea_name_to_xattr(eabuf->name, + eabuf->EaNameLength, + attr_name); + if (attr_name_len < 0) { rc =3D -EINVAL; break; } =20 - memcpy(attr_name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN); - memcpy(&attr_name[XATTR_USER_PREFIX_LEN], eabuf->name, - eabuf->EaNameLength); - attr_name[XATTR_USER_PREFIX_LEN + eabuf->EaNameLength] =3D '\0'; value =3D (char *)&eabuf->name + eabuf->EaNameLength + 1; =20 if (!eabuf->EaValueLength) { rc =3D ksmbd_vfs_casexattr_len(idmap, path->dentry, attr_name, - XATTR_USER_PREFIX_LEN + - eabuf->EaNameLength); + attr_name_len); =20 /* delete the EA only when it exits */ if (rc > 0) { --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0F4637A4B7; Fri, 17 Jul 2026 03:40:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259624; cv=none; b=C7gDOMnvtzXdPUdVHTEPfiDWBQfmF43y0czsmlQvr0hND4chRVaVN45rVrX/HCkITYYk+20bAozVR+5nRjSuLxI+CM+fbSsv/Y0dz80x4T8lJD6ri65+YDWf7An+byom17Mam5DjpjRbFjW9JC3o+TRUIl9A3+pfjEGRjI/8E2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259624; c=relaxed/simple; bh=Ya4ZipFyXeEr/FpiZ2ckFBgURreRVukXcJ0UZtYoFXc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jZm1LQJ0GUBqP//yXd4jkHrvktCTo6dGAjJqQwwrDJ/IZQvjVYe/8Rkk5U+J8MUc1ylNhgOZbewk+iHhlL3EAk5CHJz/CGNv0ZWoe0yN9RMSEpZtaUj7t8jRxZUbmkicPb7PzkL3emAhgN/dxn/zuaMNwfRj4igiWpUFZsWLmjw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 374e31f2819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:4005bc31-cf15-489a-a54c-4fc03c4e5f8f,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:4005bc31-cf15-489a-a54c-4fc03c4e5f8f,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:abc4c5befce9ae5f022e877af72b1fb5,BulkI D:260717114014KG42HEZJ,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,Bulk: nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,B RE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 374e31f2819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1949909368; Fri, 17 Jul 2026 11:40:12 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 5/9] ksmbd: extract SMB EA response name handling Date: Fri, 17 Jul 2026 11:39:23 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" smb2_get_ea() directly checks the user namespace, filters internal EAs, and removes the user prefix. Extract ksmbd_is_visible_ea_name() and keep the existing behavior unchanged. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 53 ++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index dad3427a584e..f0422e9c6a3a 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2655,6 +2655,27 @@ static int ksmbd_map_ea_name_to_xattr(const char *ea= _name, return XATTR_USER_PREFIX_LEN + ea_name_len; } =20 +static bool ksmbd_is_visible_ea_name(const char *name, const char **ea_nam= e, + size_t *ea_name_len) +{ + size_t name_len =3D strlen(name); + + if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) + return false; + + *ea_name =3D name + XATTR_USER_PREFIX_LEN; + *ea_name_len =3D name_len - XATTR_USER_PREFIX_LEN; + + if (!strncmp(*ea_name, STREAM_PREFIX, STREAM_PREFIX_LEN)) + return false; + + if (!strncmp(*ea_name, DOS_ATTRIBUTE_PREFIX, + DOS_ATTRIBUTE_PREFIX_LEN)) + return false; + + return true; +} + /** * smb2_set_ea() - handler for setting extended attributes using set * info command @@ -5203,36 +5224,25 @@ static int smb2_get_ea(struct ksmbd_work *work, str= uct ksmbd_file *fp, idx =3D 0; =20 while (idx < xattr_list_len) { + const char *ea_name; + size_t visible_name_len; + name =3D xattr_list + idx; name_len =3D strlen(name); =20 ksmbd_debug(SMB, "%s, len %d\n", name, name_len); idx +=3D name_len + 1; =20 - /* - * CIFS does not support EA other than user.* namespace, - * still keep the framework generic, to list other attrs - * in future. - */ - if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) + if (!ksmbd_is_visible_ea_name(name, &ea_name, + &visible_name_len)) continue; =20 - if (!strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX, - STREAM_PREFIX_LEN)) - continue; + name_len =3D visible_name_len; =20 if (req->InputBufferLength && - strncmp(&name[XATTR_USER_PREFIX_LEN], ea_req->name, - ea_req->EaNameLength)) + strncmp(ea_name, ea_req->name, ea_req->EaNameLength)) continue; =20 - if (!strncmp(&name[XATTR_USER_PREFIX_LEN], - DOS_ATTRIBUTE_PREFIX, DOS_ATTRIBUTE_PREFIX_LEN)) - continue; - - if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) - name_len -=3D XATTR_USER_PREFIX_LEN; - ptr =3D eainfo->name + name_len + 1; buf_free_len -=3D (offsetof(struct smb2_ea_info, name) + name_len + 1); @@ -5257,12 +5267,7 @@ static int smb2_get_ea(struct ksmbd_work *work, stru= ct ksmbd_file *fp, ptr +=3D value_len; eainfo->Flags =3D 0; eainfo->EaNameLength =3D name_len; - - if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) - memcpy(eainfo->name, &name[XATTR_USER_PREFIX_LEN], - name_len); - else - memcpy(eainfo->name, name, name_len); + memcpy(eainfo->name, ea_name, name_len); =20 eainfo->name[name_len] =3D '\0'; eainfo->EaValueLength =3D cpu_to_le16(value_len); --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81A9137BE86; Fri, 17 Jul 2026 03:40:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259623; cv=none; b=mazACR7rT8+opk1BGepKb6vA7oB0WEs074vmg/86RBWylqz9u0R0Fwyl7NgBmKuxSkFbS5BkrKeszRKAieJ50bAieaCj3/AaCZEnN2vLy1NhI5xXzfFbipjoBvEVFifko8B2qhrY+EolZScOxzsMsfNQP2Oohkl7YGRkx31Zjh0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259623; c=relaxed/simple; bh=ZkpygTwRItgn8bWH4gpGTeqgrJjF7Qb0Ne6+eXCUbQ4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G3w9JRFOyK59BTlz9vPBh7th6pNyxHn/BEtNkBbwgQ68r0NMV9TvzZ14JR8LrUIIBkqSRIFQcxXlhoaj7JqHADCJgJUPU65fFIfFys2IqmvyKNEbOvpCqB5ISA6CFOCplnwRz2x5sOR3e9mEgV2QYo+eBbmGuwrmkIXnYPmJJkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 379367ea819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:6ce1b119-44eb-49c1-8394-d1e68cb96f3d,IP:10, URL:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTIO N:release,TS:5 X-CID-INFO: VERSION:1.3.12,REQID:6ce1b119-44eb-49c1-8394-d1e68cb96f3d,IP:10,UR L:0,TC:0,Content:-5,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:5 X-CID-META: VersionHash:e7bac3a,CLOUDID:5ff049a8155971ca430d7d51686aefd8,BulkI D:260717114015J3ZNR2H6,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 379367ea819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1689766807; Fri, 17 Jul 2026 11:40:12 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 6/9] ksmbd: support security.capability EAs Date: Fri, 17 Jul 2026 11:39:24 +0800 Message-ID: <846fec356d359126e64ea64cd5f6e80ce7de4b61.1784258165.git.tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses setcap and getcap to check that a write clears the file capability. ksmbd adds the user prefix to every SMB EA name, so setcap stores security.capability as user.security.capability and getcap cannot read it as a file capability. When SMB3 POSIX extensions are available, map security.capability to the same backing xattr name. Use this mapping for set, get, and list operations. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 77 +++++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index f0422e9c6a3a..2159b45c80a6 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2643,9 +2643,35 @@ static noinline int create_smb2_pipe(struct ksmbd_wo= rk *work) return err; } =20 -static int ksmbd_map_ea_name_to_xattr(const char *ea_name, - size_t ea_name_len, char *attr_name) +static bool ksmbd_is_security_capability_ea_name(const char *name, + size_t name_len) { + return name_len =3D=3D sizeof(XATTR_NAME_CAPS) - 1 && + !strncmp(name, XATTR_NAME_CAPS, name_len); +} + +static bool ksmbd_is_posix_ea_name(const char *name, size_t name_len) +{ + if (ksmbd_is_security_capability_ea_name(name, name_len)) + return true; + + return false; +} + +static int ksmbd_map_ea_name_to_xattr(bool posix_extensions, + const char *ea_name, size_t ea_name_len, + char *attr_name) +{ + if (posix_extensions && + ksmbd_is_posix_ea_name(ea_name, ea_name_len)) { + if (ea_name_len > XATTR_NAME_MAX) + return -EINVAL; + + memcpy(attr_name, ea_name, ea_name_len); + attr_name[ea_name_len] =3D '\0'; + return ea_name_len; + } + if (ea_name_len > XATTR_NAME_MAX - XATTR_USER_PREFIX_LEN) return -EINVAL; =20 @@ -2655,24 +2681,30 @@ static int ksmbd_map_ea_name_to_xattr(const char *e= a_name, return XATTR_USER_PREFIX_LEN + ea_name_len; } =20 -static bool ksmbd_is_visible_ea_name(const char *name, const char **ea_nam= e, - size_t *ea_name_len) +static bool ksmbd_is_visible_ea_name(bool posix_extensions, const char *na= me, + const char **ea_name, size_t *ea_name_len) { size_t name_len =3D strlen(name); =20 - if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) - return false; + if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { + *ea_name =3D name + XATTR_USER_PREFIX_LEN; + *ea_name_len =3D name_len - XATTR_USER_PREFIX_LEN; + + if (!strncmp(*ea_name, STREAM_PREFIX, STREAM_PREFIX_LEN)) + return false; =20 - *ea_name =3D name + XATTR_USER_PREFIX_LEN; - *ea_name_len =3D name_len - XATTR_USER_PREFIX_LEN; + if (!strncmp(*ea_name, DOS_ATTRIBUTE_PREFIX, + DOS_ATTRIBUTE_PREFIX_LEN)) + return false; =20 - if (!strncmp(*ea_name, STREAM_PREFIX, STREAM_PREFIX_LEN)) - return false; + return true; + } =20 - if (!strncmp(*ea_name, DOS_ATTRIBUTE_PREFIX, - DOS_ATTRIBUTE_PREFIX_LEN)) + if (!posix_extensions || !ksmbd_is_posix_ea_name(name, name_len)) return false; =20 + *ea_name =3D name; + *ea_name_len =3D name_len; return true; } =20 @@ -2683,11 +2715,13 @@ static bool ksmbd_is_visible_ea_name(const char *na= me, const char **ea_name, * @buf_len: set info command buffer length * @path: dentry path for get ea * @get_write: get write access to a mount + * @posix_extensions: client negotiated SMB3 POSIX extensions * * Return: 0 on success, otherwise error */ static int smb2_set_ea(struct smb2_ea_info *eabuf, unsigned int buf_len, - const struct path *path, bool get_write) + const struct path *path, bool get_write, + bool posix_extensions) { struct mnt_idmap *idmap =3D mnt_idmap(path->mnt); char *attr_name =3D NULL, *value; @@ -2712,7 +2746,8 @@ static int smb2_set_ea(struct smb2_ea_info *eabuf, un= signed int buf_len, le16_to_cpu(eabuf->EaValueLength), le32_to_cpu(eabuf->NextEntryOffset)); =20 - attr_name_len =3D ksmbd_map_ea_name_to_xattr(eabuf->name, + attr_name_len =3D ksmbd_map_ea_name_to_xattr(posix_extensions, + eabuf->name, eabuf->EaNameLength, attr_name); if (attr_name_len < 0) { @@ -3694,7 +3729,8 @@ int smb2_open(struct ksmbd_work *work) =20 rc =3D smb2_set_ea(&ea_buf->ea, le32_to_cpu(ea_buf->ccontext.DataLength), - &path, false); + &path, false, + work->tcon->posix_extensions); if (rc =3D=3D -EOPNOTSUPP) rc =3D 0; else if (rc) @@ -5180,7 +5216,7 @@ static int smb2_get_ea(struct ksmbd_work *work, struc= t ksmbd_file *fp, } =20 path =3D &fp->filp->f_path; - /* single EA entry is requested with given user.* name */ + /* single EA entry is requested with a client-visible EA name */ if (req->InputBufferLength) { if (le32_to_cpu(req->InputBufferLength) <=3D sizeof(struct smb2_ea_info_req)) @@ -5233,14 +5269,16 @@ static int smb2_get_ea(struct ksmbd_work *work, str= uct ksmbd_file *fp, ksmbd_debug(SMB, "%s, len %d\n", name, name_len); idx +=3D name_len + 1; =20 - if (!ksmbd_is_visible_ea_name(name, &ea_name, + if (!ksmbd_is_visible_ea_name(work->tcon->posix_extensions, name, + &ea_name, &visible_name_len)) continue; =20 name_len =3D visible_name_len; =20 if (req->InputBufferLength && - strncmp(ea_name, ea_req->name, ea_req->EaNameLength)) + (name_len !=3D ea_req->EaNameLength || + strncmp(ea_name, ea_req->name, ea_req->EaNameLength))) continue; =20 ptr =3D eainfo->name + name_len + 1; @@ -7061,7 +7099,8 @@ static int smb2_set_info_file(struct ksmbd_work *work= , struct ksmbd_file *fp, return -EMSGSIZE; =20 return smb2_set_ea((struct smb2_ea_info *)buffer, - buf_len, &fp->filp->f_path, true); + buf_len, &fp->filp->f_path, true, + work->tcon->posix_extensions); } case FILE_POSITION_INFORMATION: { --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EED7931AAA3; Fri, 17 Jul 2026 03:40:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259620; cv=none; b=EjL/VsW2gmV6uBw14fqGtM/KJPjFG1i3wKBdgZvSc+jz+4ZcH4uhgMqKF4RzVb+pXXcmVlNFyz8tz3aDfNNDEeDKMLGu7fOQ25KM5yDSXfsvHzP1tCctkJLD7jSVe+WUY7ycQ02/T569WZHVeUoHo3C/l+6D4Vzqse8egFtsaQ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259620; c=relaxed/simple; bh=Hiniuf4AIr6LxacTvnC9Z/RDP+E2v2Wdlz/P+kmSW2o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=izcuiDtp9un3VM7jmVXyn6m2sh0hd2skfYcoJz72PUyj56twALpKXpiBlvXL1Y41CW634k9jvIQTnPrJ+pjzqpH17UnZmC86Uge87hF1PNA1RU+8wB27ji9o31VuXhYV1i0DZLvj/BaNOoCvhPM1k43iWfsFKnbnFP4+cVVkpOc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 37de98c8819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:bfa9cc7e-afcf-4b40-a944-caf785eb3d5c,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:bfa9cc7e-afcf-4b40-a944-caf785eb3d5c,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:b7b59803eb17251e364d3ab59795065e,BulkI D:260717114014KCEMWS01,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 37de98c8819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 445671329; Fri, 17 Jul 2026 11:40:13 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 7/9] ksmbd: support security.xfstests EAs Date: Fri, 17 Jul 2026 11:39:25 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before checking file capabilities, generic/093 calls _require_attrs security. This helper runs "setfattr -n security.xfstests". ksmbd recognizes only security.capability as a native security EA, so it stores the attribute as user.security.xfstests. Add security.xfstests as another exact security EA name. Use this name directly for set, get, and list operations. Do not support other security xattrs. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 2159b45c80a6..da3d5c217577 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2650,11 +2650,21 @@ static bool ksmbd_is_security_capability_ea_name(co= nst char *name, !strncmp(name, XATTR_NAME_CAPS, name_len); } =20 +static bool ksmbd_is_security_xfstests_ea_name(const char *name, + size_t name_len) +{ + return name_len =3D=3D sizeof(XATTR_SECURITY_PREFIX "xfstests") - 1 && + !strncmp(name, XATTR_SECURITY_PREFIX "xfstests", name_len); +} + static bool ksmbd_is_posix_ea_name(const char *name, size_t name_len) { if (ksmbd_is_security_capability_ea_name(name, name_len)) return true; =20 + if (ksmbd_is_security_xfstests_ea_name(name, name_len)) + return true; + return false; } =20 --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0D59237AA8C; Fri, 17 Jul 2026 03:40:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259622; cv=none; b=LFv6aIyMZWz/7UzUQQ+qVom3+lmbhrMGtLA8DjT5GS6A/k9pdAmO+7YocN9TVf8peDBKrtzp/tlS1Pv8CpCk6lzMTao97H5gae4XooxJdTDHEMhMmQkkn4wha6UsMf5N8GWSULCZ4lIwo7aKxk+KkPdJKurCVXLeTNHry/ZNZ6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259622; c=relaxed/simple; bh=S2PJ9TQ6CSK/i30KBfyB5QWhwJ0KurmhlpTRvnPvlIg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MeRSRmRADdip83PbFela+QxEONjz31pPiNNvELB+pTaaMviJno0GvMFAztxOITN3AteMcfWrBBMtrYqxK+4pMwie+on9XHJUJzVGOYJMmT/msoDo3nmHOB3T/gnQaUaF/cy59MTd7AznFEPmFedLmABApNgg7JRDwe0t7NoIsRw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 3825ea3e819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:81402134-0a88-4cbc-a0cf-3500cf1bcf98,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:81402134-0a88-4cbc-a0cf-3500cf1bcf98,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:f8ffe0a57a6fa949b9d4653810794a4f,BulkI D:26071711401402TO5L99,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|136|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,B ulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR :0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 3825ea3e819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 1222735318; Fri, 17 Jul 2026 11:40:13 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 8/9] ksmbd: support trusted EAs Date: Fri, 17 Jul 2026 11:39:26 +0800 Message-ID: <44a69ab54011239b84fc4afcdaf7869863d052bb.1784258165.git.tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 uses "setfattr -n trusted.name" and getfattr to check that a write does not clear the trusted xattr. ksmbd stores the attribute as user.trusted.name on the backing filesystem. Map trusted names to the trusted xattr namespace for set, get, and list operations. Filter the internal POSIX ACL xattrs. Signed-off-by: Ze Tan --- fs/smb/server/smb2pdu.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index da3d5c217577..7b2baa317888 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -2643,6 +2643,19 @@ static noinline int create_smb2_pipe(struct ksmbd_wo= rk *work) return err; } =20 +static bool ksmbd_is_internal_acl_ea_name(const char *name, size_t name_le= n) +{ + return (name_len =3D=3D sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1 && + !strncmp(name, XATTR_NAME_POSIX_ACL_ACCESS, name_len)) || + (name_len =3D=3D sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1 && + !strncmp(name, XATTR_NAME_POSIX_ACL_DEFAULT, name_len)) || + (name_len =3D=3D sizeof(XATTR_TRUSTED_PREFIX "SGI_ACL_FILE") - 1 && + !strncmp(name, XATTR_TRUSTED_PREFIX "SGI_ACL_FILE", name_len)) || + (name_len =3D=3D sizeof(XATTR_TRUSTED_PREFIX "SGI_ACL_DEFAULT") - = 1 && + !strncmp(name, XATTR_TRUSTED_PREFIX "SGI_ACL_DEFAULT", + name_len)); +} + static bool ksmbd_is_security_capability_ea_name(const char *name, size_t name_len) { @@ -2665,6 +2678,18 @@ static bool ksmbd_is_posix_ea_name(const char *name,= size_t name_len) if (ksmbd_is_security_xfstests_ea_name(name, name_len)) return true; =20 + /* + * POSIX ACL xattrs are filesystem-internal ACL records, not + * user-visible EAs. XFS may also expose trusted.SGI_ACL_* aliases + * through listxattr(), so filter those as well. + */ + if (ksmbd_is_internal_acl_ea_name(name, name_len)) + return false; + + if (name_len > XATTR_TRUSTED_PREFIX_LEN && + !strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) + return true; + return false; } =20 @@ -2672,6 +2697,9 @@ static int ksmbd_map_ea_name_to_xattr(bool posix_exte= nsions, const char *ea_name, size_t ea_name_len, char *attr_name) { + if (ksmbd_is_internal_acl_ea_name(ea_name, ea_name_len)) + return -EINVAL; + if (posix_extensions && ksmbd_is_posix_ea_name(ea_name, ea_name_len)) { if (ea_name_len > XATTR_NAME_MAX) --=20 2.43.0 From nobody Sat Jul 25 06:09:13 2026 Received: from mailgw.kylinos.cn (mailgw.kylinos.cn [124.126.103.232]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 802FA37BE80; Fri, 17 Jul 2026 03:40:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=124.126.103.232 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259623; cv=none; b=rj4544/Dqw+vbJSHV9vd43C5AxGsDVEV7qcmfLfy0iXG38QV823BtrfG41zt3LVW/mgnSXFWsqzAdpG98jNsFJCHr8gBIa2NifaP68QvS34Zf6x7SB6Danl4LUQzF/T/1zVxXsloYxpo4Cvp9f30tDn83miZvw9bd5YZfRWVYNE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784259623; c=relaxed/simple; bh=yxVbMvJOYPtAxSynYawp9hhn3qIDuH4QCT75qRVh5Lc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iQYkDCl7PWuwn/PQ68Qgtbb28EoS1A5/JaasJNeAh3JDP9wtmGOc3lcjEiWhFlpIBOhDUxUDjmeMZly42QP4y2ShRyzDtBaS9zsjWCqjszSBq+RnKyRA0cnpGAzjmT5JcBzd7IXvahv7CUGRxNe2QtRH8zxnQjWEDLbZJRQTT1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn; spf=pass smtp.mailfrom=kylinos.cn; arc=none smtp.client-ip=124.126.103.232 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kylinos.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kylinos.cn X-UUID: 3872483e819111f1aa26b74ffac11d73-20260717 X-CTIC-Tags: HR_CC_COUNT, HR_CC_DOMAIN_COUNT, HR_CC_NO_NAME, HR_CTE_8B, HR_CTT_MISS HR_DATE_H, HR_DATE_WKD, HR_DATE_ZONE, HR_FROM_NAME, HR_SJ_DIGIT_LEN HR_SJ_LANG, HR_SJ_LEN, HR_SJ_LETTER, HR_SJ_NOR_SYM, HR_SJ_PHRASE HR_SJ_PHRASE_LEN, HR_SJ_WS, HR_TO_COUNT, HR_TO_DOMAIN_COUNT, HR_TO_NO_NAME IP_TRUSTED, SRC_TRUSTED, DN_TRUSTED, SA_EXISTED, SN_UNTRUSTED SN_LOWREP, SN_EXISTED, SPF_NOPASS, DKIM_NOPASS, DMARC_NOPASS CIE_GOOD, CIE_GOOD_SPF, GTI_FG_BS, GTI_RG_INFO, GTI_C_BU AMN_GOOD, ABX_MISS_RDNS X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.12,REQID:b494fd96-a682-467a-ad68-123ecd9c8be2,IP:10, URL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION :release,TS:10 X-CID-INFO: VERSION:1.3.12,REQID:b494fd96-a682-467a-ad68-123ecd9c8be2,IP:10,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:10 X-CID-META: VersionHash:e7bac3a,CLOUDID:a7dbfa419539c7ca40503006457835b2,BulkI D:260717114015AMVYFD6Y,BulkQuantity:0,Recheck:0,SF:10|38|66|78|81|82|102|1 27|865|898,TC:nil,Content:0|15|50,EDM:-3,IP:-2,URL:0,File:nil,RT:nil,Bulk: nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,B RE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 3872483e819111f1aa26b74ffac11d73-20260717 X-User: tanze@kylinos.cn Received: from desktop-od00ebi.localdomain [(116.128.244.169)] by mailgw.kylinos.cn (envelope-from ) (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256) with ESMTP id 280125222; Fri, 17 Jul 2026 11:40:14 +0800 From: Ze Tan To: sfrench@samba.org, linkinjeon@kernel.org, pc@manguebit.org, sprasad@microsoft.com, tom@talpey.comm, senozhatsky@chromium.org, chenxiaosong@chenxiaosong.com, linux-cifs@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tanze@kylinos.cn Subject: [RFC PATCH v2 9/9] ksmbd: avoid self oplock breaks for EA opens Date: Fri, 17 Jul 2026 11:39:27 +0800 Message-ID: <37f280818ac592b7e641d08325b4c10ae6bb7c99.1784258165.git.tanze@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" generic/093 writes to a file after setcap sets security.capability. The CIFS client can reopen the file to query or update EAs while the same session holds an oplock. ksmbd breaks this oplock and waits for the same client, so the write can block. Skip the oplock break for same-session EA or metadata opens. Keep the normal break when another session holds an oplock. Signed-off-by: Ze Tan --- fs/smb/server/oplock.c | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/fs/smb/server/oplock.c b/fs/smb/server/oplock.c index 3c55ae5d6a11..85f7c29fc2c4 100644 --- a/fs/smb/server/oplock.c +++ b/fs/smb/server/oplock.c @@ -1424,6 +1424,49 @@ void smb_lazy_parent_lease_break_close(struct ksmbd_= file *fp) ksmbd_inode_put(p_ci); } =20 +static bool ksmbd_skip_session_ea_break(struct ksmbd_work *work, + struct ksmbd_file *fp, + int req_op_level, + struct lease_ctx_info *lctx) +{ + struct oplock_info *opinfo; + bool same_session =3D false; + bool foreign_session =3D false; + __le32 ea_meta_mask =3D FILE_READ_EA_LE | FILE_WRITE_EA_LE | + FILE_READ_ATTRIBUTES_LE | + FILE_WRITE_ATTRIBUTES_LE | + FILE_READ_CONTROL_LE | FILE_SYNCHRONIZE_LE; + + if (!work || !fp || lctx || req_op_level !=3D SMB2_OPLOCK_LEVEL_NONE) + return false; + + /* + * Avoid self-deadlock when the same session reopens the file only + * to read/write EAs or metadata, e.g. CIFS killpriv querying or + * removing security.capability during buffered write. + */ + if (!(fp->daccess & (FILE_READ_EA_LE | FILE_WRITE_EA_LE)) || + (fp->daccess & ~ea_meta_mask)) + return false; + + down_read(&fp->f_ci->m_lock); + list_for_each_entry(opinfo, &fp->f_ci->m_op_list, op_entry) { + if (!opinfo->conn || opinfo->level =3D=3D SMB2_OPLOCK_LEVEL_NONE) + continue; + + if (opinfo->sess =3D=3D work->sess) + same_session =3D true; + else + foreign_session =3D true; + + if (same_session && foreign_session) + break; + } + up_read(&fp->f_ci->m_lock); + + return same_session && !foreign_session; +} + /** * smb_grant_oplock() - handle oplock/lease request on file open * @work: smb work @@ -1529,6 +1572,12 @@ int smb_grant_oplock(struct ksmbd_work *work, int re= q_op_level, u64 pid, goto err_out; } =20 + if (share_ret >=3D 0 && + ksmbd_skip_session_ea_break(work, fp, req_op_level, lctx)) { + opinfo_put(prev_opinfo); + goto set_lev; + } + if (prev_opinfo->level !=3D SMB2_OPLOCK_LEVEL_BATCH && prev_opinfo->level !=3D SMB2_OPLOCK_LEVEL_EXCLUSIVE) { opinfo_put(prev_opinfo); --=20 2.43.0