Re: [PATCH] config.mak.uname: Define FREAD_READS_DIRECTORIES for GNU/Hurd

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Apr 22, 2020 at 12:13:50PM -0700, Brandon Casey wrote:

> On Wed, Apr 22, 2020 at 11:48 AM Brandon Casey <drafnel@xxxxxxxxx> wrote:
> >
> > I just looked in config.mak.uname, and I'm surprised to see
> > FREAD_READS_DIRECTORIES set for so many platforms. And it's set for
> > Linux and Darwin?!?!? Junio added it for Darwin
> > (8e178ec4d072da4cd8f4449e17aef3aff5b57f6a) and Nguyễn Thái Ngọc Duy
> > added it for Linux (e2d90fd1c33ae57e4a6da5729ae53876107b3463), but
> > also seemed to mistake the intention of FREAD_FREADS_DIRECTORIES as
> > being about the fopen(..., "r") of a directory rather than about an
> > fread() of a directory.
> >
> > I just wrote a test program and tested on Linux, Darwin, and Windows.
> > Linux and Darwin both succeed to fopen() a directory and fail to
> > fread() it, as expected. Windows fails to fopen() a directory.
> >
> > I notice this earlier commit mentions a failure of t1308
> > (4e3ecbd43958b1400d6cb85fe5529beda1630e3a). I wonder if this is the
> > reason FREAD_READS_DIRECTORIES was added to so many platforms?
> 
> Whoops, I got the order of e2d90fd1c33ae57e4a6da5729ae53876107b3463
> and 4e3ecbd43958b1400d6cb85fe5529beda1630e3a wrong. Looks like the
> misunderstanding of FREAD_READS_DIRECTORIES in e2d90fd could have been
> the cause of all of this. That commit introduced the test t1308 and
> added FREAD_READS... to Linux, kFreeBSD, and FreeBSD, and the other
> additions followed shortly after.

I think the code is actually doing the right thing (or at least
something useful), and the "FREAD" in the name is the confusing part.
Because there's now code doing:

  fh = fopen(fn, "r");
  if (!fh) {
    if (errno == ENOENT || errno == EISDIR) {
       /* not actually a file; treat as a gentle noop */
       return 0;
    } else {
       die_errno("omg, a real open error");
    }
  }
  if (!fread(..., fh))
       die_errno("omg, a real read error");

which is exactly what the failing test in t1308 is doing.

I know that wasn't the original intent of the flag, but I think it was a
conscious decision to build on around the time of e2d90fd1c, when we
started actually checking fopen() return values (as opposed to just
segfaulting).

And in practice, do we really care about cases that can fopen a
directory but refuse to read from it? It's simpler and more efficient to
catch this case up front.

So I think the knob has de facto become "do we need to use our compat
wrapper to make opening a directory fail with EISDIR". And any attempt
to change that will mean adapting all of the callers to handle that case
themselves. I think what we have now is the useful knob we want; it's
just misnamed (and obviously I don't blame your original patch; it was
adapted over time).

-Peff



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux