[PATCH 04/15] ksmbd: handle empty and disappearing EAs
Ze Tan <[email protected]> Fri, 24 Jul 2026 18:39:58 +0800
| Newsgroups | org.kernel.vger.linux-cifs |
|---|---|
| Message-ID | <6965627419a93f2ed0d9f14b437a136ebbcdfd9c.1784888897.git.tanze@kylinos.cn> |
A zero-length xattr value is valid, but smb2_get_ea() currently treats every non-positive result from ksmbd_vfs_getxattr() as a missing EA. Accept zero and encode an empty value in the response. An xattr can also disappear between listxattr() and getxattr(). Skip an entry that returns -ENODATA without consuming response space, while preserving other errors. Signed-off-by: Ze Tan <[email protected]> --- fs/smb/server/smb2pdu.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c index 2131625dbc2d..39a72cda6704 100644 --- a/fs/smb/server/smb2pdu.c +++ b/fs/smb/server/smb2pdu.c @@ -5245,24 +5245,26 @@ static int smb2_get_ea(struct ksmbd_work *work, struct ksmbd_file *fp, continue; ptr = eainfo->name + name_len + 1; - buf_free_len -= (offsetof(struct smb2_ea_info, name) + - name_len + 1); - /* bailout if xattr can't fit in buf_free_len */ value_len = ksmbd_vfs_getxattr(idmap, path->dentry, name, &buf); - if (value_len <= 0) { - rc = -ENOENT; + if (value_len == -ENODATA) + continue; + if (value_len < 0) { + rc = value_len; rsp->hdr.Status = STATUS_INVALID_HANDLE; goto out; } + buf_free_len -= (offsetof(struct smb2_ea_info, name) + + name_len + 1); buf_free_len -= value_len; if (buf_free_len < 0) { kfree(buf); break; } - memcpy(ptr, buf, value_len); + if (value_len) + memcpy(ptr, buf, value_len); kfree(buf); ptr += value_len; -- 2.43.0