Yet another rename workaround - this time check for . and .. early because
relookup() objects to being asked to handle them.
This commit is contained in:
parent
fc5b5e6ac9
commit
d868f7242f
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: vfs_syscalls.c,v 1.347 2008/03/25 22:13:32 ad Exp $ */
|
||||
/* $NetBSD: vfs_syscalls.c,v 1.348 2008/03/28 05:02:08 dholland Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2008 The NetBSD Foundation, Inc.
|
||||
|
@ -70,7 +70,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.347 2008/03/25 22:13:32 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.348 2008/03/28 05:02:08 dholland Exp $");
|
||||
|
||||
#include "opt_compat_netbsd.h"
|
||||
#include "opt_compat_43.h"
|
||||
|
@ -3298,6 +3298,17 @@ do_sys_rename(const char *from, const char *to, enum uio_seg seg, int retain)
|
|||
* in nfs_serv.c. Proceed accordingly.
|
||||
*/
|
||||
vrele(fvp);
|
||||
if ((fromnd.ni_cnd.cn_namelen == 1 &&
|
||||
fromnd.ni_cnd.cn_nameptr[0] == '.') ||
|
||||
(fromnd.ni_cnd.cn_namelen == 2 &&
|
||||
fromnd.ni_cnd.cn_nameptr[0] == '.' &&
|
||||
fromnd.ni_cnd.cn_nameptr[1] == '.')) {
|
||||
error = EINVAL;
|
||||
VFS_RENAMELOCK_EXIT(fs);
|
||||
VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
|
||||
vrele(fromnd.ni_dvp);
|
||||
goto out1;
|
||||
}
|
||||
saveflag = fromnd.ni_cnd.cn_flags & SAVESTART;
|
||||
fromnd.ni_cnd.cn_flags &= ~SAVESTART;
|
||||
vn_lock(fromnd.ni_dvp, LK_EXCLUSIVE | LK_RETRY);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: nfs_serv.c,v 1.137 2008/03/08 08:03:46 yamt Exp $ */
|
||||
/* $NetBSD: nfs_serv.c,v 1.138 2008/03/28 05:02:08 dholland Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1989, 1993
|
||||
|
@ -55,7 +55,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.137 2008/03/08 08:03:46 yamt Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.138 2008/03/28 05:02:08 dholland Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -1874,6 +1874,17 @@ nfsrv_rename(nfsd, slp, lwp, mrq)
|
|||
|
||||
/* Copied, regrettably, from vfs_syscalls.c (q.v.) */
|
||||
vrele(fvp);
|
||||
if ((fromnd.ni_cnd.cn_namelen == 1 &&
|
||||
fromnd.ni_cnd.cn_nameptr[0] == '.') ||
|
||||
(fromnd.ni_cnd.cn_namelen == 2 &&
|
||||
fromnd.ni_cnd.cn_nameptr[0] == '.' &&
|
||||
fromnd.ni_cnd.cn_nameptr[1] == '.')) {
|
||||
error = EINVAL;
|
||||
VFS_RENAMELOCK_EXIT(localfs);
|
||||
VOP_ABORTOP(fromnd.ni_dvp, &fromnd.ni_cnd);
|
||||
vrele(fromnd.ni_dvp);
|
||||
goto out1;
|
||||
}
|
||||
saveflag = fromnd.ni_cnd.cn_flags & SAVESTART;
|
||||
fromnd.ni_cnd.cn_flags &= ~SAVESTART;
|
||||
vn_lock(fromnd.ni_dvp, LK_EXCLUSIVE | LK_RETRY);
|
||||
|
|
Loading…
Reference in New Issue