and B is in some other file system.
[bug introduced in coreutils-9.0]
+ cp, mv, and install, on older systems like Solaris 10 without O_DIRECTORY
+ support, avoid opening non directory destination operands. Opening such
+ files can have side effects, like hanging with a fifo for example.
+ [bug introduced in coreutils-9.0]
+
On macOS, fmt no longer corrupts multi-byte characters
by misdetecting their component bytes as spaces.
[This bug was present in "the beginning".]
if (must_be_working_directory (file))
return AT_FDCWD;
- int fd = open (file, O_PATHSEARCH | O_DIRECTORY);
+ int fd = -1;
+ bool is_a_dir = false;
+ struct stat st;
+
+ /* On old systems like Solaris 10, check with stat first
+ lest we try to open a fifo for example and hang. */
+ if (!O_DIRECTORY && stat (file, &st) == 0)
+ {
+ is_a_dir = !!S_ISDIR (st.st_mode);
+ if (! is_a_dir)
+ errno = ENOTDIR;
+ }
+
+ if (O_DIRECTORY || is_a_dir)
+ fd = open (file, O_PATHSEARCH | O_DIRECTORY);
if (!O_DIRECTORY && 0 <= fd)
{
- /* On old systems like Solaris 10 that do not support O_DIRECTORY,
- check by hand whether FILE is a directory. */
- struct stat st;
+ /* On old systems like Solaris 10 double check type,
+ to ensure we've opened a directory. */
int err;
if (fstat (fd, &st) != 0 ? (err = errno, true)
: !S_ISDIR (st.st_mode) && (err = ENOTDIR, true))
touch e || framework-failure
-
-# Without -f, expect it to fail.
-cp -R fifo e || fail=1
-
-# With -f, it must succeed.
-cp -Rf fifo e || fail=1
-test -p fifo || fail=1
+for force in '' '-f'; do
+ # Second time through will need to unlink fifo e
+ timeout 10 cp -R $force fifo e || fail=1
+ test -p fifo || fail=1
+done
Exit $fail