On 2025-05-24 11:45, Peter Dyballa wrote:
This function in lib/targetdir.c, target_directory_operand(), seems to work OK:

     63   if (must_be_working_directory (file))

evaluates to false

     72   if (!O_DIRECTORY)

evaluates to false – and we come to:

     88   if (try_to_open)
     89     {
     90       fd = open (file, O_PATHSEARCH | O_DIRECTORY);
     91
     92       /* On platforms lacking O_PATH, using O_SEARCH | O_DIRECTORY to
     93          open an overly-protected non-directory can fail with either
     94          EACCES or ENOTDIR.  Prefer ENOTDIR as it makes for better
     95          diagnostics.  */
     96       if (O_PATHSEARCH == O_SEARCH && fd < 0 && errno == EACCES)
     97         errno = (((O_DIRECTORY ? stat (file, st) : stat_result) == 0
     98                   && !S_ISDIR (st->st_mode))
     99                  ? ENOTDIR : EACCES);
    100     }

open() on line #90 returns 7

That's wrong. O_DIRECTORY means that open should fail when FILE is not a directory". In this case the file is "out" which is a regular file not a directory. Perhaps macOS is ignoring the O_DIRECTORY flag?

Can you verify that a simple program like the following triggers this macOS bug? If so, we might be able to work around it. You may need to munge this program a bit to get it to compile and illustrate the bug on macOS.

  #include <errno.h>
  #include <fcntl.h>
  #include <stdio.h>
  #include <unistd.h>

  #ifndef O_SEARCH
  # define O_SEARCH O_RDONLY
  #endif

  int
  main ()
  {
    int fd = open ("out", O_WRONLY | O_CREAT, 0666);
    if (fd < 0)
      return perror ("create"), 1;
    close (fd);
    fd = open ("out", O_SEARCH | O_DIRECTORY);
    if (fd < 0 && errno == ENOTDIR)
      return 0;
    if (fd < 0)
      return perror ("open"), 1;
    fprintf (stderr, "O_DIRECTORY incorrectly succeeded!\n");
    return 1;
  }




Reply via email to