Allow fchdir() from non-O_PATH fds
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 19 Jun 2018 17:28:04 +0000 (13:28 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 19 Jun 2018 17:28:04 +0000 (13:28 -0400)
commit3887bc1cec9630f9925ab0dbb37210d9d6659fd7
tree4c9c3f4f3e362ae28ed0922cd703ddc0d5ad9c52
parent4f7963d34b99a9282ed96d146839239c48bfeccd
Allow fchdir() from non-O_PATH fds

If you chdir to an open FD, later when you did something like create a
file from DOT, we'd panic.  The FD in current->dot was opened and not
O_PATH, which you can't walk from (see devclone()).

The regular sys_chdir does a namec(Atodir), which does not call the
device's open, so that chan is a kernel-internal, non-open chan (to use
the parlance of devclone()).

The current fix works for most cases.  If you do something like
dfd = open(some_dir, O_READ); unlink(some_dir); fchdir(dfd);, the lookup
will fail.  Using O_PATH instead of O_READ should work.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/ns/sysfile.c