fs: 9p: avoid warning during xattr allocation

Message ID 20240202121319.21743-1-pchelkin@ispras.ru
State New
Headers
Series fs: 9p: avoid warning during xattr allocation |

Commit Message

Fedor Pchelkin Feb. 2, 2024, 12:13 p.m. UTC
  An invalid server may reply with an xattr size which still fits into
ssize_t but is large enough to cause splat during kzalloc().

Add __GFP_NOWARN flag for the allocation. It seems client side can't do
much more about sanity checking here so it's better to return ENOMEM
silently.

Found by Linux Verification Center (linuxtesting.org) with Syzkaller.

Fixes: 85ff872d3f4a ("fs/9p: Implement POSIX ACL permission checking function")
Reported-by: syzbot+56fdf7f6291d819b9b19@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/lkml/000000000000789bcd05c9aa3d5d@google.com/
Reported-by: syzbot+a83dc51a78f0f4cf20da@syzkaller.appspotmail.com
Closes: https://lore.kernel.org/lkml/00000000000086a03405eec3a706@google.com/
Suggested-by: Pavel Skripkin <paskripkin@gmail.com>
Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru>
---
 fs/9p/acl.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Dominique Martinet March 4, 2024, 1:09 p.m. UTC | #1
Fedor Pchelkin wrote on Fri, Feb 02, 2024 at 03:13:17PM +0300:
> An invalid server may reply with an xattr size which still fits into
> ssize_t but is large enough to cause splat during kzalloc().


Ah, sorry for not replying to this earlier.. and I had forgotten about
it when something similar came up just now.

I've submitted a patch to limit such allocations to 64k:
https://lkml.kernel.org/r/20240304-xattr_maxsize-v1-1-322357ec6bdf@codewreck.org

Would you agree this makes this patch obsolete?

I'll go ahead and add the reported-by/closes you cited in this mail to
my commit.
  

Patch

diff --git a/fs/9p/acl.c b/fs/9p/acl.c
index eed551d8555f..e19a46192d2e 100644
--- a/fs/9p/acl.c
+++ b/fs/9p/acl.c
@@ -29,7 +29,7 @@  static struct posix_acl *v9fs_fid_get_acl(struct p9_fid *fid, const char *name)
 	if (size == 0)
 		return ERR_PTR(-ENODATA);
 
-	value = kzalloc(size, GFP_NOFS);
+	value = kzalloc(size, GFP_NOFS | __GFP_NOWARN);
 	if (!value)
 		return ERR_PTR(-ENOMEM);