Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Feb 2013 21:59:22 -0500 (EST)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        FreeBSD Filesystems <freebsd-fs@freebsd.org>
Cc:        Sergey Kandaurov <pluknet@freebsd.org>, Kostik Belousov <kib@freebsd.org>
Subject:   should vn_fullpath1() ever return a path with "." in it?
Message-ID:  <707174204.3391839.1362020362019.JavaMail.root@erie.cs.uoguelph.ca>
In-Reply-To: <860349954.3391816.1362020304865.JavaMail.root@erie.cs.uoguelph.ca>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Hi,

Sergey Kandaurov reported a problem where getcwd() returns a
path with "/./" imbedded in it for an NFSv4 mount. This is
caused by a mount point crossing on the server when at the
server's root because vn_fullpath1() uses VV_ROOT to spot
mount point crossings.

The current workaround is to use the sysctls:
debug.disablegetcwd=1
debug.disablefullpath=1

However, it would be nice to fix this when vn_fullpath1()
is being used.

A simple fix is to have vn_fullpath1() fail when it finds
"." as a directory match in the path. When vn_fullpath1()
fails, the syscalls fail and that allows the libc algorithm
to be used (which works for this case because it doesn't
depend on VV_ROOT being set, etc).

So, I am wondering if a patch (I have attached one) that
makes vn_fullpath1() fail when it matches "." will break
anything else? (I don't think so, since the code checks
for VV_ROOT in the loop above the check for a match of
".", but I am not sure?)

Thanks for any input w.r.t. this, rick

[-- Attachment #2 --]
--- kern/vfs_cache.c.sav	2013-02-27 20:44:42.000000000 -0500
+++ kern/vfs_cache.c	2013-02-27 21:10:39.000000000 -0500
@@ -1333,6 +1333,20 @@ vn_fullpath1(struct thread *td, struct v
 			    startvp, NULL, 0, 0);
 			break;
 		}
+		if (buf[buflen] == '.' && (buf[buflen + 1] == '\0' ||
+		    buf[buflen + 1] == '/')) {
+			/*
+			 * Fail if it matched ".". This should only happen
+			 * for NFSv4 mounts that cross server mount points.
+			 */
+			CACHE_RUNLOCK();
+			vrele(vp);
+			numfullpathfail1++;
+			error = ENOENT;
+			SDT_PROBE(vfs, namecache, fullpath, return,
+			    error, vp, NULL, 0, 0);
+			break;
+		}
 		buf[--buflen] = '/';
 		slash_prefixed = 1;
 	}

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?707174204.3391839.1362020362019.JavaMail.root>