This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[hurd,commited 2/5] hurd: Fix O_DIRECTORY | O_NOFOLLOW


Appending / to the path to be looked up would make 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.

	* hurd/hurdlookup.c (__hurd_file_name_lookup): Do not append '/' to
	path when flags contains O_NOFOLLOW.
	* hurd/lookup-retry.c (__hurd_file_name_lookup_retry): Return ENOTDIR
	if flags contains O_DIRECTORY and the result is a directory.
---
 ChangeLog           | 4 ++++
 hurd/hurdlookup.c   | 2 +-
 hurd/lookup-retry.c | 2 ++
 3 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 82ddda54ba..a02f9017de 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -64,6 +64,10 @@
 	* sysdeps/mach/hurd/cthreads.c: Include <cthreads.h>.
 	* hurd/lookup-retry.c (__hurd_file_name_lookup_retry): Return ELOOP
 	when opening a symlink with O_NOFOLLOW.
+	* hurd/hurdlookup.c (__hurd_file_name_lookup): Do not append '/' to
+	path when flags contains O_NOFOLLOW.
+	* hurd/lookup-retry.c (__hurd_file_name_lookup_retry): Return ENOTDIR
+	if flags contains O_DIRECTORY and the result is a directory.
 
 2018-03-17  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
diff --git a/hurd/hurdlookup.c b/hurd/hurdlookup.c
index 1861d5879d..a642c49002 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) == 0)
     {
       /* 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 12b5c30962..b596848624 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.16.2


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]