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);
 

Reply via email to