aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRodney W. Grimes <rgrimes@FreeBSD.org>1995-07-07 07:58:41 +0000
committerRodney W. Grimes <rgrimes@FreeBSD.org>1995-07-07 07:58:41 +0000
commit61ef752e7f0193be8196506c471aa1c9a2dc90b8 (patch)
tree8118617971ddeb04a712e715384e437d92283346
parent792c5524f2aff6aa3a5c7d28e142efc8df830063 (diff)
downloadsrc-61ef752e7f0193be8196506c471aa1c9a2dc90b8.tar.gz
src-61ef752e7f0193be8196506c471aa1c9a2dc90b8.zip
Branch: RELENG_2_0_5
cvs update -j 1.15.4.1 nfs_subs.c
Notes
Notes: svn path=/releng/2.0.5/; revision=9424
-rw-r--r--sys/nfs/nfs_subs.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c
index 9aeb0d6e84b3..a2048c27231a 100644
--- a/sys/nfs/nfs_subs.c
+++ b/sys/nfs/nfs_subs.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_subs.c 8.3 (Berkeley) 1/4/94
- * $Id: nfs_subs.c,v 1.14 1995/05/29 04:01:09 davidg Exp $
+ * $Id: nfs_subs.c,v 1.15.4.1 1995/06/28 05:49:39 davidg Exp $
*/
/*
@@ -712,7 +712,26 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper)
fp = (struct nfsv2_fattr *)cp2;
vtyp = nfstov_type(fp->fa_type);
vmode = fxdr_unsigned(u_short, fp->fa_mode);
- if (vtyp == VNON || vtyp == VREG)
+ /*
+ * XXX
+ *
+ * The duplicate information returned in fa_type and fa_mode
+ * is an ambiguity in the NFS version 2 protocol.
+ *
+ * VREG should be taken literally as a regular file. If a
+ * server intents to return some type information differently
+ * in the upper bits of the mode field (e.g. for sockets, or
+ * FIFOs), NFSv2 mandates fa_type to be VNON. Anyway, we
+ * leave the examination of the mode bits even in the VREG
+ * case to avoid breakage for bogus servers, but we make sure
+ * that there are actually type bits set in the upper part of
+ * fa_mode (and failing that, trust the va_type field).
+ *
+ * NFSv3 cleared the issue, and requires fa_mode to not
+ * contain any type information (while also introduing sockets
+ * and FIFOs for fa_type).
+ */
+ if (vtyp == VNON || (vtyp == VREG && (vmode & S_IFMT) != 0))
vtyp = IFTOVT(vmode);
if (isnq) {
rdev = fxdr_unsigned(long, fp->fa_nqrdev);