Q: chroot(9) returning EFAULT

Paul Herman pherman at frenchfries.net
Mon Mar 15 18:15:31 PST 2004


On Mon, 15 Mar 2004, Matthew Dillon wrote:

>     chroot() is expecting arguments in userspace, you are handing it
>     kernelspace addresses.

That's what I figured, but then how does jail(2) do it?  It's
ca.path points to the stack?  That's what got me.

>     What you need to do is to separate chroot() into chroot() (which
>     takes userspace arguments) and kern_chroot() (which takes kernelspace
>     arguments).  Then you can call kern_chroot() directly.

That's what I'll end up doing, in my case that would be the best
solution anyway.  I'm porting the jail_attach(2)/jls(8) stuff from
5.x and jail_attach(2) chroot()s into a struct vnode rather than a
path (in case someone mv()s the jail root), so it'd be best for me
to just break up chroot() into chroot(char *path) and
vchroot(struct vnode *) and have one just call the other.  While
I'm making changes, I can write up a kern_chroot(), no problem.

I still don't quite get how the jail(2) syscall gets away with it.
It does:

{
	struct prison j;
	struct chroot_args ca;

	[...]
	ca.path = j.pr_path;	/* !!!! */
	error = chroot(&ca);
	[...]
}

hmmm...

-Paul.





More information about the Kernel mailing list