aboutsummaryrefslogtreecommitdiff
path: root/sys/nfsserver
diff options
context:
space:
mode:
authorJoerg Wunsch <joerg@FreeBSD.org>1995-06-14 06:23:38 +0000
committerJoerg Wunsch <joerg@FreeBSD.org>1995-06-14 06:23:38 +0000
commitec05e1f5d7df9a78c20413fb999f798cbb65b34e (patch)
tree843c9d2d6c9ef80fda166f13e4690583a93b04de /sys/nfsserver
parent6a834fc3f1d26261449ee183996ab54ed442becb (diff)
Notes
Diffstat (limited to 'sys/nfsserver')
-rw-r--r--sys/nfsserver/nfs_srvsubs.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c
index 9aeb0d6e84b3..1653c8b4cb3d 100644
--- a/sys/nfsserver/nfs_srvsubs.c
+++ b/sys/nfsserver/nfs_srvsubs.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 1995/05/30 08:12:43 rgrimes 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);