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>
