>Number:         178103
>Category:       kern
>Synopsis:       Correct support of index files for WebNFS exports
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Apr 24 09:50:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Andrey Simonenko
>Release:        FreeBSD 10-CURRENT amd64
>Organization:
>Environment:
>Description:

RFC 2055 describes index files for WebNFS exports.  The exports(5) manual
page has description of the -index option, but this option does not work
because of mistakes in mountd and kernel part of the NFS server.

The following change:

1. corrects handling of the -index option in usr.sbin/mountd/mountd.c;

2. corrects fetching of the index file in sys/kern/vfs_export.c;

3. corrects locking if a directory does not have the index file in
   sys/nfsserver/nfs_serv.c

This change is for the old NFS server, since new NFS server uses
another API for WebNFS settings and its logic of index files does not
correspond to RFC 2055.

>How-To-Repeat:

Export some file system with options "-public -index 123", then mount it
using NFSv2/3 client and public filehandle.  Create a regular file "123"
in some directory and try to read that directory on a client.  Do the same,
but create directory "123" with some content.  In both cases the content
of a directory with the index file in NFS mounted file system should
be altered.

>Fix:

---------------------------------------------------------------------------
This is for mountd:

--- mountd.c.orig       2013-02-22 11:36:42.000000000 +0200
+++ mountd.c    2013-04-24 11:36:31.000000000 +0300
@@ -68,6 +68,7 @@ __FBSDID("$FreeBSD: src/usr.sbin/mountd/
 #include <arpa/inet.h>
 
 #include <ctype.h>
+#include <dirent.h>
 #include <err.h>
 #include <errno.h>
 #include <grp.h>
@@ -2232,7 +2233,14 @@ do_opt(char **cpp, char **endcpp, struct
                        *exflagsp |= (MNT_EXPUBLIC|MNT_EXRDONLY|MNT_EXPORTANON);
                        opt_flags |= OP_MAPALL;
                } else if (cpoptarg && !strcmp(cpopt, "index")) {
+                       if (strlen(cpoptarg) > MAXNAMLEN) {
+                               syslog(LOG_ERR, "too long file name");
+                               return (1);
+                       }
                        ep->ex_indexfile = strdup(cpoptarg);
+                       if (ep->ex_indexfile == NULL)
+                               out_of_mem();
+                       usedarg++;
                } else if (!strcmp(cpopt, "quiet")) {
                        opt_flags |= OP_QUIET;
                } else if (cpoptarg && !strcmp(cpopt, "sec")) {


---------------------------------------------------------------------------
This is for the kernel:

diff -ruNp sys.orig/kern/vfs_export.c sys/kern/vfs_export.c
--- sys.orig/kern/vfs_export.c  2013-02-22 11:36:29.000000000 +0200
+++ sys/kern/vfs_export.c       2013-04-12 14:36:18.000000000 +0300
@@ -387,7 +387,7 @@ vfs_setpublicfs(struct mount *mp, struct
         * If an indexfile was specified, pull it in.
         */
        if (argp->ex_indexfile != NULL) {
-               if (nfs_pub.np_index != NULL)
+               if (nfs_pub.np_index == NULL)
                        nfs_pub.np_index = malloc(MAXNAMLEN + 1, M_TEMP,
                            M_WAITOK);
                error = copyinstr(argp->ex_indexfile, nfs_pub.np_index,
diff -ruNp sys.orig/nfsserver/nfs_serv.c sys/nfsserver/nfs_serv.c
--- sys.orig/nfsserver/nfs_serv.c       2013-03-09 13:01:24.000000000 +0200
+++ sys/nfsserver/nfs_serv.c    2013-04-11 12:07:43.000000000 +0300
@@ -583,7 +583,8 @@ nfsrv_lookup(struct nfsrv_descript *nfsd
                                vrele(nd.ni_startdir);
                                nd.ni_startdir = NULL;
                                ndp = &ind;
-                       }
+                       } else
+                               vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY);
                        error = 0;
                }
                /*
>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to