diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 25b1e8d5b1f9..3e115a8ff704 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -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 -__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); diff --git a/sys/nfs/nfs_serv.c b/sys/nfs/nfs_serv.c index 4a02a7bcc2a3..ef2a8d554441 100644 --- a/sys/nfs/nfs_serv.c +++ b/sys/nfs/nfs_serv.c @@ -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 -__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 #include @@ -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);