Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Aug 2000 13:06:17 -0400 (EDT)
From:      Robert Watson <rwatson@FreeBSD.ORG>
To:        Poul-Henning Kamp <phk@critter.freebsd.dk>
Cc:        freebsd-fs@FreeBSD.ORG
Subject:   Re: procfs_lookup() and jail interaction 
Message-ID:  <Pine.NEB.3.96L.1000828130132.84062L-100000@fledge.watson.org>
In-Reply-To: <11697.967482003@critter>

next in thread | previous in thread | raw e-mail | index | archive | help

On Mon, 28 Aug 2000, Poul-Henning Kamp wrote:

> In message <Pine.NEB.3.96L.1000828124049.84062K-100000@fledge.watson.org>, Robe
> rt Watson writes:
> >
> >So I've largely resolved these concerns -- as a synthetic in-memory file
> >system, procfs is not using the name cache -- the issue I'm running into
> >now in procfs is with the open() syscall.  Following the p_stuff patches,
> >procfs_getattrt() and so on all return ENOENT.  However, an attempt to
> >call open(/proc/1, O_CREAT) results in an EISDIR error, instead of EROFS.
> >I believe this may be a result of that type check happening in vn_open,
> >above the VFS layer, resulting in procfs_* never seeing the request, and
> >thereby revealing the presence of the directory.
> 
> Uhm, isn't a VOP_GETATTR() done to find out what we're fiddling ?
> 
> How else would it know that it is a directory ?

So perhaps I need to do some more tracing to track this down further, but
my believe is that procfs_getattr() should not be returning information to
the calling process:

        switch (pfs->pfs_type) {
        case Proot:
        case Pcurproc:
                procp = 0;
                break;

        default:
                procp = PFIND(pfs->pfs_pid);
                if (procp == 0 || procp->p_cred == NULL ||
                    procp->p_ucred == NULL)
                        return (ENOENT);

                if (p_cansee(ap->a_p, procp, NULL))
                        return (ENOENT);
        }

However:

alsvid:/data/fbsd-commit/src/sys/miscfs/procfs> touch /proc/1
alsvid:/data/fbsd-commit/src/sys/miscfs/procfs> su
Password:
alsvid# sysctl -w kern.ps_showallprocs=0
kern.ps_showallprocs: 1 -> 0
alsvid# exit
alsvid:/data/fbsd-commit/src/sys/miscfs/procfs> touch /proc/1
touch: /proc/1: Is a directory
alsvid:/data/fbsd-commit/src/sys/miscfs/procfs>

But:

alsvid:/data/fbsd-commit/src/sys/miscfs/procfs> ktrace touch /proc/1
touch: /proc/1: Is a directory
alsvid:/data/fbsd-commit/src/sys/miscfs/procfs> kdump

...
   260 touch    CALL  stat(0xbfbffc42,0xbfbffaa0)
   260 touch    NAMI  "/proc/1"
   260 touch    RET   stat -1 errno 2 No such file or directory
   260 touch    CALL  open(0xbfbffc42,0x201,0x1b6)
   260 touch    NAMI  "/proc/1"
   260 touch    RET   open -1 errno 21 Is a directory

So open() is returning EISDIR.

It looks like vn_open looks directory at vp->v_type to determine if it's a
directory, not relying on the results of VOP_GETATTR:

        if ((fmode & O_CREAT) == 0) {
                mode = 0;
                if (fmode & (FWRITE | O_TRUNC)) {
                        if (vp->v_type == VDIR) {
                                error = EISDIR;
                                goto bad;
                        }

So the check is still happening above the VFS layer.

I'll look at the code further this evening.

  Robert N M Watson 

robert@fledge.watson.org              http://www.watson.org/~robert/
PGP key fingerprint: AF B5 5F FF A6 4A 79 37  ED 5F 55 E9 58 04 6A B1
TIS Labs at Network Associates, Safeport Network Services




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-fs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.96L.1000828130132.84062L-100000>