Nelson H. F. Beebe wrote:

touch foo bar && ls -ld foo bar && ln -f foo bar
...
-rw-rw-r-- 1 bowman sysstaff 0 Mar 15 15:55 bar
-rw-rw-r-- 1 bowman sysstaff 0 Mar 15 15:55 foo
ln: failed to access 'bar/foo': Not a directory

Thanks for reporting that. It's a serious error on Solaris 10, or on any platform lacking support for the O_DIRECTORY flag standardized in POSIX.1-2008.

I installed the attached patch. We should probably generate a new coreutils release soon.

>From 6a707feee86ffd8eee1f8f1e7a701693d0489ffb Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Sat, 16 Mar 2019 11:24:19 -0700
Subject: [PATCH] ln: port to platforms lacking O_DIRECTORY
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* src/ln.c (main): Port to older platforms lacking
support for POSIX.1-2008’s O_DIRECTORY flag (Bug#34876).
---
 src/ln.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/ln.c b/src/ln.c
index afdb61a1d..a5b012b39 100644
--- a/src/ln.c
+++ b/src/ln.c
@@ -610,13 +610,25 @@ main (int argc, char **argv)
           int flags = (O_PATHSEARCH | O_DIRECTORY
                        | (dereference_dest_dir_symlinks ? 0 : O_NOFOLLOW));
           destdir_fd = openat_safer (AT_FDCWD, d, flags);
+          int err = errno;
+          if (!O_DIRECTORY && 0 <= destdir_fd)
+            {
+              struct stat st;
+              err = (fstat (destdir_fd, &st) != 0 ? errno
+                     : S_ISDIR (st.st_mode) ? 0 : ENOTDIR);
+              if (err != 0)
+                {
+                  close (destdir_fd);
+                  destdir_fd = -1;
+                }
+            }
           if (0 <= destdir_fd)
             {
               n_files -= !target_directory;
               target_directory = d;
             }
           else if (! (n_files == 2 && !target_directory))
-            die (EXIT_FAILURE, errno, _("target %s"), quoteaf (d));
+            die (EXIT_FAILURE, err, _("target %s"), quoteaf (d));
         }
     }
 
-- 
2.17.1

Reply via email to