| From | Sent On | Attachments |
|---|---|---|
| Robert Watson | Aug 27, 2000 8:30 am | |
| Robert Watson | Aug 28, 2000 9:43 am | |
| Poul-Henning Kamp | Aug 28, 2000 9:59 am | |
| Robert Watson | Aug 28, 2000 10:05 am | |
| Poul-Henning Kamp | Aug 28, 2000 10:19 am | |
| Robert Watson | Aug 28, 2000 10:35 am | |
| Boris Popov | Aug 28, 2000 6:14 pm |
| Subject: | Re: procfs_lookup() and jail interaction | |
|---|---|---|
| From: | Robert Watson (rwat...@FreeBSD.ORG) | |
| Date: | Aug 28, 2000 10:05:55 am | |
| List: | org.freebsd.freebsd-fs | |
On Mon, 28 Aug 2000, Poul-Henning Kamp wrote:
In message <Pine...@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
rob...@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 majo...@FreeBSD.org with "unsubscribe freebsd-fs" in the body of the message





