Author: rpokala
Date: Wed Feb 28 00:30:03 2018
New Revision: 330093
URL: https://svnweb.freebsd.org/changeset/base/330093

Log:
  MFC r329682:
  
  mountd: Return proper errno values in a few error paths
  
  When attempting to mount a non-directory which exists, return ENOTDIR
  instead of ENOENT. If stat() or statfs() failed, don't pass part of the
  invalid (struct statfs) to ex_search(). In that same case, preserve the
  value of "bad" rather than overwriting with EACCES.

Modified:
  stable/10/usr.sbin/mountd/mountd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/mountd/mountd.c
==============================================================================
--- stable/10/usr.sbin/mountd/mountd.c  Wed Feb 28 00:29:52 2018        
(r330092)
+++ stable/10/usr.sbin/mountd/mountd.c  Wed Feb 28 00:30:03 2018        
(r330093)
@@ -1072,8 +1072,6 @@ mntsrv(struct svc_req *rqstp, SVCXPRT *transp)
                 */
                if (realpath(rpcpath, dirpath) == NULL ||
                    stat(dirpath, &stb) < 0 ||
-                   (!S_ISDIR(stb.st_mode) &&
-                   (dir_only || !S_ISREG(stb.st_mode))) ||
                    statfs(dirpath, &fsb) < 0) {
                        chdir("/");     /* Just in case realpath doesn't */
                        syslog(LOG_NOTICE,
@@ -1083,10 +1081,23 @@ mntsrv(struct svc_req *rqstp, SVCXPRT *transp)
                                warnx("stat failed on %s", dirpath);
                        bad = ENOENT;   /* We will send error reply later */
                }
+               if (!bad &&
+                   !S_ISDIR(stb.st_mode) &&
+                   (dir_only || !S_ISREG(stb.st_mode))) {
+                       syslog(LOG_NOTICE,
+                           "mount request from %s for non-directory path %s",
+                           numerichost, dirpath);
+                       if (debug)
+                               warnx("mounting non-directory %s", dirpath);
+                       bad = ENOTDIR;  /* We will send error reply later */
+               }
 
                /* Check in the exports list */
                sigprocmask(SIG_BLOCK, &sighup_mask, NULL);
-               ep = ex_search(&fsb.f_fsid);
+               if (bad)
+                       ep = NULL;
+               else
+                       ep = ex_search(&fsb.f_fsid);
                hostset = defset = 0;
                if (ep && (chk_host(ep->ex_defdir, saddr, &defset, &hostset,
                    &numsecflavors, &secflavorsp) ||
@@ -1137,7 +1148,8 @@ mntsrv(struct svc_req *rqstp, SVCXPRT *transp)
                                    "mount request succeeded from %s for %s",
                                    numerichost, dirpath);
                } else {
-                       bad = EACCES;
+                       if (!bad)
+                               bad = EACCES;
                        syslog(LOG_NOTICE,
                            "mount request denied from %s for %s",
                            numerichost, dirpath);
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to