Module Name: src
Committed By: pooka
Date: Wed Jul 14 13:09:52 UTC 2010
Modified Files:
src/tests/fs/puffs/h_dtfs: dtfs.h dtfs_subr.c dtfs_vnops.c
Log Message:
prevent rename of source directory under itself
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/fs/puffs/h_dtfs/dtfs.h \
src/tests/fs/puffs/h_dtfs/dtfs_subr.c \
src/tests/fs/puffs/h_dtfs/dtfs_vnops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/fs/puffs/h_dtfs/dtfs.h
diff -u src/tests/fs/puffs/h_dtfs/dtfs.h:1.1 src/tests/fs/puffs/h_dtfs/dtfs.h:1.2
--- src/tests/fs/puffs/h_dtfs/dtfs.h:1.1 Tue Jul 6 14:16:44 2010
+++ src/tests/fs/puffs/h_dtfs/dtfs.h Wed Jul 14 13:09:52 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: dtfs.h,v 1.1 2010/07/06 14:16:44 pooka Exp $ */
+/* $NetBSD: dtfs.h,v 1.2 2010/07/14 13:09:52 pooka Exp $ */
/*
* Copyright (c) 2006 Antti Kantee. All Rights Reserved.
@@ -118,6 +118,8 @@
void dtfs_baseattrs(struct vattr *, enum vtype, ino_t);
void dtfs_updatetimes(struct puffs_node *, int, int, int);
+bool dtfs_isunder(struct puffs_node *, struct puffs_node *);
+
#define DTFS_CTOF(a) ((struct dtfs_file *)(((struct puffs_node *)a)->pn_data))
#define DTFS_PTOF(a) ((struct dtfs_file *)(a->pn_data))
Index: src/tests/fs/puffs/h_dtfs/dtfs_subr.c
diff -u src/tests/fs/puffs/h_dtfs/dtfs_subr.c:1.1 src/tests/fs/puffs/h_dtfs/dtfs_subr.c:1.2
--- src/tests/fs/puffs/h_dtfs/dtfs_subr.c:1.1 Tue Jul 6 14:16:44 2010
+++ src/tests/fs/puffs/h_dtfs/dtfs_subr.c Wed Jul 14 13:09:52 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: dtfs_subr.c,v 1.1 2010/07/06 14:16:44 pooka Exp $ */
+/* $NetBSD: dtfs_subr.c,v 1.2 2010/07/14 13:09:52 pooka Exp $ */
/*
* Copyright (c) 2006 Antti Kantee. All Rights Reserved.
@@ -338,3 +338,18 @@
if (domtime)
pn->pn_va.va_mtime = ts;
}
+
+bool
+dtfs_isunder(struct puffs_node *pn, struct puffs_node *pn_parent)
+{
+ struct dtfs_file *df;
+
+ while (pn) {
+ if (pn == pn_parent)
+ return true;
+ df = DTFS_CTOF(pn);
+ pn = df->df_dotdot;
+ }
+
+ return false;
+}
Index: src/tests/fs/puffs/h_dtfs/dtfs_vnops.c
diff -u src/tests/fs/puffs/h_dtfs/dtfs_vnops.c:1.1 src/tests/fs/puffs/h_dtfs/dtfs_vnops.c:1.2
--- src/tests/fs/puffs/h_dtfs/dtfs_vnops.c:1.1 Tue Jul 6 14:16:44 2010
+++ src/tests/fs/puffs/h_dtfs/dtfs_vnops.c Wed Jul 14 13:09:52 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: dtfs_vnops.c,v 1.1 2010/07/06 14:16:44 pooka Exp $ */
+/* $NetBSD: dtfs_vnops.c,v 1.2 2010/07/14 13:09:52 pooka Exp $ */
/*
* Copyright (c) 2006 Antti Kantee. All Rights Reserved.
@@ -305,9 +305,16 @@
{
struct dtfs_dirent *dfd_src;
struct puffs_node *pn_sdir = opc;
+ struct puffs_node *pn_sfile = src;
struct puffs_node *pn_tdir = targ_dir;
struct puffs_node *pn_tfile = targ;
+ /* check that we don't do the old amigados trick */
+ if (pn_sfile->pn_va.va_type == VDIR) {
+ if (dtfs_isunder(pn_tdir, pn_sfile))
+ return EINVAL;
+ }
+
dfd_src = dtfs_dirgetbyname(DTFS_PTOF(pn_sdir),
pcn_src->pcn_name, pcn_src->pcn_namelen);