From ba9feb14c5f5780758b6d62ebb44cd90b99eccc4 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sat, 2 Sep 2023 16:47:13 +0200 Subject: S_dir_lookup: Handle O_DIRECTORY When e.g. looking up a socket with O_DIRECTORY, we should return ENOTDIR rather than EACCESS. --- libdiskfs/dir-lookup.c | 3 ++- libnetfs/dir-lookup.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c index 8df81cfa..76b9cb54 100644 --- a/libdiskfs/dir-lookup.c +++ b/libdiskfs/dir-lookup.c @@ -56,6 +56,7 @@ diskfs_S_dir_lookup (struct protid *dircred, int type; struct protid *newpi = 0; struct peropen *newpo = 0; + int orig_flags = flags; if (!dircred) return EOPNOTSUPP; @@ -447,7 +448,7 @@ diskfs_S_dir_lookup (struct protid *dircred, gotit: type = np->dn_stat.st_mode & S_IFMT; - if (mustbedir && type != S_IFDIR) + if ((mustbedir || orig_flags & O_DIRECTORY) && type != S_IFDIR) { err = ENOTDIR; goto out; diff --git a/libnetfs/dir-lookup.c b/libnetfs/dir-lookup.c index d77feac8..23cc1fe1 100644 --- a/libnetfs/dir-lookup.c +++ b/libnetfs/dir-lookup.c @@ -410,7 +410,7 @@ netfs_S_dir_lookup (struct protid *dircred, /* At this point, NP is the node to return. */ gotit: - if (mustbedir) + if (mustbedir || (flags & O_DIRECTORY)) { err = netfs_validate_stat (np, dircred->user); if (err) -- cgit v1.2.3