From 34a2c3f281cb2effd3de4b469815e537f3b02733 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Fri, 26 Jan 2018 22:35:29 +0000 Subject: [PATCH] hurd: Fix O_DIRECTORY | O_NOFOLLOW Appending / to the path to be looked up makes us always follow a final symlink, even with O_NOTRANS (since the final resolution is after the '/'). In the O_DIRECTORY | O_NOFOLLOW case, we thus have to really open the node and stat it, which we already do anyway, and check for directory type. Signed-off-by: Samuel Thibault Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name tg-NOFOLLOW-DIRECTORY.diff --- hurd/hurdlookup.c | 2 +- hurd/lookup-retry.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hurd/hurdlookup.c b/hurd/hurdlookup.c index 84cb3d301..7d1c471b5 100644 --- a/hurd/hurdlookup.c +++ b/hurd/hurdlookup.c @@ -72,7 +72,7 @@ __hurd_file_name_lookup (error_t (*use_init_port) if (flags & O_NOFOLLOW) /* See lookup-retry.c about O_NOFOLLOW. */ flags |= O_NOTRANS; - if (flags & O_DIRECTORY) + if (flags & O_DIRECTORY && !(flags & O_NOFOLLOW)) { /* The caller wants to require that the file we look up is a directory. We can do this without an extra RPC by appending a trailing slash diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c index 4e6c765b7..bae3ec1a4 100644 --- a/hurd/lookup-retry.c +++ b/hurd/lookup-retry.c @@ -147,6 +147,8 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port) err = __io_stat (*result, &st); if (!err) { + if (flags & O_DIRECTORY && !S_ISDIR(st.st_mode)) + err = ENOTDIR; if (S_ISLNK(st.st_mode)) err = ELOOP; else if (st.st_mode & (S_IPTRANS|S_IATRANS)) -- 2.30.2