tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: [PATCH] POSIX extended API set 2
Taylor R Campbell <campbell+netbsd-tech-kern%mumble.net@localhost> wrote:
> I don't think namei.h / vfs_lookup.c is the right place to be handling
> file descriptors. Can you make these take vnodes, rather than file
> descriptors, or move them into vfs_syscalls.c?
I made the change, but it makes nameiat_simple_user() usage more
complicated, with code duplicated on each call (see example at the end)
> I think you'll leak pb here in the error branch above. I haven't gone
> through the other error branches in the patch, but the proliferation
> of new resource acquisitions requiring clean-up makes me nervous.
The problem is that we need to hold a reference on the vnode we use
in NDAT().
+static int
+do_sys_chmodat(struct lwp *l, int fdat, const char *path, int mode, int flags)
+{
int error;
struct vnode *vp;
+ namei_simple_flags_t nsflag;
+ file_t *dfp = NULL;
+ struct vnode *dvp = NULL;
- error = namei_simple_user(SCARG(uap, path),
- NSM_FOLLOW_TRYEMULROOT, &vp);
+ if (flags & AT_SYMLINK_NOFOLLOW)
+ nsflag = NSM_NOFOLLOW_TRYEMULROOT;
+ else
+ nsflag = NSM_FOLLOW_TRYEMULROOT;
+
+ /* fd_getvnode() will use the descriptor for us */
+ if (fdat != AT_FDCWD) {
+ if ((error = fd_getvnode(fdat, &dfp)) != 0)
+ return (error);
+ dvp = dfp->f_data;
+ }
+
+ error = nameiat_simple_user(dvp, path, nsflag, &vp);
if (error != 0)
- return (error);
+ goto out;
- error = change_mode(vp, SCARG(uap, mode), l);
+ error = change_mode(vp, mode, l);
vrele(vp);
+out:
+ if (dfp != NULL)
+ fd_putfile(fdat);
+
return (error);
}
--
Emmanuel Dreyfus
http://hcpnet.free.fr/pubz
manu%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index