diff mbox series

[v2] ksmbd: make __dir_empty() compatible with POSIX

Message ID 20240904043635.782603-1-hobin.woo@samsung.com (mailing list archive)
State New, archived
Headers show
Series [v2] ksmbd: make __dir_empty() compatible with POSIX | expand

Commit Message

Hobin Woo Sept. 4, 2024, 4:36 a.m. UTC
Some file systems may not provide dot (.) and dot-dot (..) as they are
optional in POSIX. ksmbd can misjudge emptiness of a directory in those
file systems, since it assumes there are always at least two entries:
dot and dot-dot.
Just don't count dot and dot-dot.

Signed-off-by: Hobin Woo <hobin.woo@samsung.com>
---
v2:
 - Just don't count dot and dot-dot.

 fs/smb/server/vfs.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Namjae Jeon Sept. 4, 2024, 2:30 p.m. UTC | #1
On Wed, Sep 4, 2024 at 1:36 PM Hobin Woo <hobin.woo@samsung.com> wrote:
>
> Some file systems may not provide dot (.) and dot-dot (..) as they are
> optional in POSIX. ksmbd can misjudge emptiness of a directory in those
> file systems, since it assumes there are always at least two entries:
> dot and dot-dot.
> Just don't count dot and dot-dot.
>
> Signed-off-by: Hobin Woo <hobin.woo@samsung.com>
Applied it to #ksmbd-for-next-next.
Thanks for your patch!
diff mbox series

Patch

diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
index 9e859ba010cf..62de668cd1e1 100644
--- a/fs/smb/server/vfs.c
+++ b/fs/smb/server/vfs.c
@@ -1115,9 +1115,10 @@  static bool __dir_empty(struct dir_context *ctx, const char *name, int namlen,
 	struct ksmbd_readdir_data *buf;
 
 	buf = container_of(ctx, struct ksmbd_readdir_data, ctx);
-	buf->dirent_count++;
+	if (!is_dot_dotdot(name, namlen))
+		buf->dirent_count++;
 
-	return buf->dirent_count <= 2;
+	return !buf->dirent_count;
 }
 
 /**
@@ -1137,7 +1138,7 @@  int ksmbd_vfs_empty_dir(struct ksmbd_file *fp)
 	readdir_data.dirent_count = 0;
 
 	err = iterate_dir(fp->filp, &readdir_data.ctx);
-	if (readdir_data.dirent_count > 2)
+	if (readdir_data.dirent_count)
 		err = -ENOTEMPTY;
 	else
 		err = 0;