This is the mail archive of the cygwin-patches@cygwin.com mailing list for the Cygwin 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]

Re: access()


Corinna Vinschen wrote:

> Applied.

Corinna,

I am still worried about using !real_path.exists() to determine
non existence, as done in several places in Cygwin. 
That function checks if the file attributes are FFFFFFFF

After some experiments I found out that GetFileAttributes returns
FFFFFFF on an existing file if
a) the file ACL does not allow the caller to read the attributes
and
b) the directory is unreadable.
Do you agree or is it more complicated?

In principle this does not prevent the caller from reading the
security descriptor.

To return more accurate information, symlink_info::check could call
GetLastError. If it == 5, the file exists but there is an access problem. 
What to do then is TBD.

If we take for granted that (with the existing code) the situation is
hopeless when the file attributes are FFFFFFFFF then the test 
  if (!pc->exists ())
    {
      debug_printf ("already determined that pc does not exist");
could be moved from fhandler_disk_file::fstat_by_name
to fhandler_disk_file::fstat (after the get_io_handle test).

While we are at it, set_query_open (query_open_already = true);
could also be called when a file has acls and ntsec is true.

On the other hand, if we keep the fstat code as it is, then for consistency
the following code in access
  if (!real_path.exists ())
    {
      set_errno (ENOENT);
      return -1;
    }

  if (!(flags & (R_OK | W_OK | X_OK)))
    return 0;

should be weakened to
  if (real_path.exists () && !(flags & (R_OK | W_OK | X_OK)))
    return 0
so that we go ahead and try to read the sd even with !real_path.exists()

What you you think?

Pierre


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