From 34b407ca1531ce91287d6bc14d5570909474abbf Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 5 Jan 2021 05:22:54 +0100 Subject: [PATCH] link: Improve trailing slash handling on native Windows. * lib/link.c (link): If stat() fails, provide a better errno. --- ChangeLog | 5 +++++ lib/link.c | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index a579efc9b9..e88a08a28e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2021-01-04 Bruno Haible + + link: Improve trailing slash handling on native Windows. + * lib/link.c (link): If stat() fails, provide a better errno. + 2021-01-04 Bruno Haible mkfifoat: Work around trailing slash bug in mknodat() on AIX 7.2. diff --git a/lib/link.c b/lib/link.c index 87dae40796..21c7f7aed0 100644 --- a/lib/link.c +++ b/lib/link.c @@ -85,16 +85,24 @@ link (const char *file1, const char *file2) errno = EPERM; return -1; } - /* Reject trailing slashes on non-directories; mingw does not + /* Reject trailing slashes on non-directories; native Windows does not support hard-linking directories. */ if ((len1 && (file1[len1 - 1] == '/' || file1[len1 - 1] == '\\')) || (len2 && (file2[len2 - 1] == '/' || file2[len2 - 1] == '\\'))) { + /* If stat() fails, then link() should fail for the same reason. */ struct stat st; - if (stat (file1, &st) == 0 && S_ISDIR (st.st_mode)) - errno = EPERM; - else + if (stat (file1, &st)) + { + if (errno == EOVERFLOW) + /* It's surely a file, not a directory (see stat-w32.c). */ + errno = ENOTDIR; + return -1; + } + if (!S_ISDIR (st.st_mode)) errno = ENOTDIR; + else + errno = EPERM; return -1; } /* CreateHardLink("b/.","a",NULL) creates file "b", so we must check -- 2.39.5