j...@wxcvbn.org (Jeremie Courreges-Anglas) writes:

> j...@wxcvbn.org (Jeremie Courreges-Anglas) writes:
>
>> "Todd C. Miller" <todd.mil...@courtesan.com> writes:
>>
>>> From source inspection, Net and Free appear to allow read(2) of
>>> dirs to succeed.  However, since Linux, Mac OS X and Solaris have
>>> the EISDIR behavior I think it is probably safe from a portability
>>> standpoint.
>>>
>>> We're long past the days when opendir(3)/readdir(3) used read(2)...
>>>
>>> HP-UX and AIX still allow reads of directories but no one cares
>>> about them ;-)
>>
>> So I think that we agree that EISDIR is more useful, and seems safe from
>> a portability POV.   I've built base and x sets on i386, and ajacoutot
>> ran the ports bulk builds.  The two offenders in the ports tree were due
>> to an unrelated glitch in base libtool which has since been fixed.
>
> I've hold this for a few days until the release cycle comes back to an
> almost normal state.  But, as Theo points out, we have to think about the
> drawbacks.  Some configurations that do work right now are very likely
> to break.
>
>   $ cat /; echo $?
>   cat: /: Is a directory
>   1
>
> is only a trivial example.
>
> I still think that it is better to error out instead of, for example,
> silently ignoring invalid/mistyped CLI arguments and config parameters.
> But I don't want to mindlessly break people's setups behind their backs,
> so I'd like to hear more opinions and... *test reports*.

I haven't received a single test report, which is far from sufficient
for such a change.  Even though I'm convinced that such a change would
be a benefit, I won't push this further.

> Diff below for convenience.
>
>
> Index: lib/libc/sys/read.2
> ===================================================================
> RCS file: /cvs/src/lib/libc/sys/read.2,v
> retrieving revision 1.35
> diff -u -p -r1.35 read.2
> --- lib/libc/sys/read.2       5 Feb 2015 02:33:09 -0000       1.35
> +++ lib/libc/sys/read.2       9 Jul 2016 17:20:39 -0000
> @@ -152,13 +152,15 @@ is not a valid file or socket descriptor
>  Part of
>  .Fa buf
>  points outside the process's allocated address space.
> -.It Bq Er EIO
> -An I/O error occurred while reading from the file system.
>  .It Bq Er EINTR
>  A read from a slow device
>  (i.e. one that might block for an arbitrary amount of time)
>  was interrupted by the delivery of a signal
>  before any data arrived.
> +.It Bq Er EIO
> +An I/O error occurred while reading from the file system.
> +.It Bq Er EISDIR
> +The underlying file is a directory.
>  .El
>  .Pp
>  In addition,
> Index: sys/kern/vfs_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/vfs_vnops.c,v
> retrieving revision 1.85
> diff -u -p -r1.85 vfs_vnops.c
> --- sys/kern/vfs_vnops.c      19 Jun 2016 11:54:33 -0000      1.85
> +++ sys/kern/vfs_vnops.c      9 Jul 2016 17:20:39 -0000
> @@ -336,11 +336,13 @@ vn_read(struct file *fp, off_t *poff, st
>       if (vp->v_type != VCHR && count > LLONG_MAX - *poff)
>               return (EINVAL);
>  
> +     if (vp->v_type == VDIR)
> +             return (EISDIR);
> +
>       vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
>       uio->uio_offset = *poff;
> -     if (vp->v_type != VDIR)
> -             error = VOP_READ(vp, uio,
> -                 (fp->f_flag & FNONBLOCK) ? IO_NDELAY : 0, cred);
> +     error = VOP_READ(vp, uio, (fp->f_flag & FNONBLOCK) ? IO_NDELAY : 0,
> +         cred);
>       *poff += count - uio->uio_resid;
>       VOP_UNLOCK(vp, p);
>       return (error);

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to