[Toybox] ls -laZ /dev takes a long time

Rich Felker dalias at libc.org
Sat Oct 17 09:21:30 PDT 2015


On Fri, Oct 16, 2015 at 12:56:01PM -0700, enh wrote:
> at the moment, ls.c has this:
> 
>   if (flags & FLAG_Z) {
>     if (!CFG_TOYBOX_LSM_NONE) {
>       int fd;
> 
>       // Why not just openat(O_PATH|(O_NOFOLLOW*!!(toys.optflags&FLAG_L))) and
>       // lsm_fget_context() on that filehandle? Because the kernel is broken,
>       // and won't let us read this "metadata" from the filehandle unless we
>       // have permission to read the data. We _can_ read the same data in
>       // by path, we just can't do it through an O_PATH filehandle, because
>       // reasons. So as a bug workaround for the broken kernel, we do it
>       // both ways.
>       //
>       // The O_NONBLOCK is there to avoid triggering automounting (there's
>       // a rush of nostalgia for you) on directories we don't descend into,
>       // which O_PATH would have done for us but see "the kernel is broken".
>       if (S_ISSOCK(new->st.st_mode) ||
>           (S_ISLNK(new->st.st_mode) && !(toys.optflags & FLAG_L)) ||
>           -1 == (fd = openat(dirtree_parentfd(new), new->name,
>                              O_RDONLY|O_NONBLOCK|O_NOATIME)))

I don't know about this specific case, but generally you can work
around all the situations where O_PATH misbehaves when operating on
the resulting fd by using the function that takes a pathname and
passing /proc/self/fd/%d with the O_PATH fd filled-in instead.

> but that doesn't work well in /dev.
> 
> root at shamu:/ # time ls -laZ /dev > /dev/null
>     0m10.33s real     0m0.05s user     0m0.62s system
> 
> some files, like /dev/smd_pkt_loopback, take a long time to fail to open:
> 
>      0.003022 openat(4, "smd_pkt_loopback",
> O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_NOATIME) = -1 EPROBE_DEFER (Unknown
> error 517)
>      5.185825 lgetxattr("/dev/smd_pkt_loopback", "security.selinux",
> "u:object_r:device:s0", 255) = 21
> 
> it seems dangerous to be opening every file when running "ls", as
> opening a /dev file could have side effects or hang. if an open is

Yes, unwanted opening of device nodes is generally dangerous. It can
also cause side effects like acquiring a controlling terminal; this
specific one can be avoided with O_NOCTTY but others probably exist
too.

Rich

 1445098890.0


More information about the Toybox mailing list