Skip to content

Commit

Permalink
mountd: Return proper errno values in a few error paths
Browse files Browse the repository at this point in the history
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.

Submitted by:	Bruce Leverett (Panasas)
Reviewed by:	rmacklem
MFC after:	1 week
Sponsored by:	Panasas
Differential Revision:	https://reviews.freebsd.org/D14438
  • Loading branch information
rpokala-freebsd committed Feb 21, 2018
1 parent e5a4a83 commit b235f01
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions usr.sbin/mountd/mountd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1053,8 +1053,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,
Expand All @@ -1064,10 +1062,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) ||
Expand Down Expand Up @@ -1118,7 +1129,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);
Expand Down

0 comments on commit b235f01

Please sign in to comment.