From: neilbrown Date: Fri, 23 May 2003 03:58:39 +0000 (+0000) Subject: Stuff X-Git-Tag: nfs-utils-1-1-0-pre4^0 X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=936ecbb5750e0e29b9e2464998a8e03eca617b72;p=nfs-utils.git Stuff --- diff --git a/ChangeLog b/ChangeLog index 09277b3..60fd487 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2003-05-23 NeilBrown + + * utils/mountd/cache.c(cache_get_filehandle): take a separate path + argument as we might not be getting the filehandle for the + mountpoint. + * utils/mountd/mountd.c(get_rootfh): pass real path when calling + cache_get_filehandle. + * utils/mountd/mountd.c(get_rootfh): check export point and + requested directory are on the same filesystem, and complain if + not. + 2003-05-22 NeilBrown * utils/mountd/auth.c(auth_authenticate_internal): make sure diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 1d1567d..c5bc53f 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -335,7 +335,7 @@ void cache_export(nfs_export *exp) * } <> /proc/fs/nfs/filehandle */ struct nfs_fh_len * -cache_get_filehandle(nfs_export *exp, int len) +cache_get_filehandle(nfs_export *exp, int len, char *p) { FILE *f = fopen("/proc/fs/nfs/filehandle", "r+"); char buf[200]; @@ -345,7 +345,7 @@ cache_get_filehandle(nfs_export *exp, int len) return NULL; qword_print(f, exp->m_client->m_hostname); - qword_print(f, exp->m_export.e_path); + qword_print(f, p); qword_printint(f, len); qword_eol(f); diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index 145a4da..b1bce1d 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -25,7 +25,7 @@ #include "rpcmisc.h" extern void cache_open(void); -extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len); +extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len, char *p); extern void cache_export(nfs_export *exp); extern void my_svc_run(void); @@ -242,7 +242,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, int *error, int v3) { struct sockaddr_in *sin = (struct sockaddr_in *) svc_getcaller(rqstp->rq_xprt); - struct stat stb; + struct stat stb, estb; nfs_export *exp; char rpath[MAXPATHLEN+1]; char *p = *path; @@ -272,6 +272,16 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, int *error, int v3) } else if (!S_ISDIR(stb.st_mode) && !S_ISREG(stb.st_mode)) { xlog(L_WARNING, "%s is not a directory or regular file", p); *error = NFSERR_NOTDIR; + } else if (stat(exp->m_export.e_path, &estb) < 0) { + xlog(L_WARNING, "can't stat export point %s: %s", + p, strerror(errno)); + *error = NFSERR_NOENT; + } else if (estb.st_dev != stb.st_dev + /* && (!new_cache || !(exp->m_export.e_flags & NFSEXP_CROSSMNT)) */ + ) { + xlog(L_WARNING, "request to export directory %s below nearest filesystem %s", + p, exp->m_export.e_path); + *error = NFSERR_ACCES; } else if (new_cache) { /* This will be a static private nfs_export with just one * address. We feed it to kernel then extract the filehandle, @@ -280,7 +290,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, int *error, int v3) struct nfs_fh_len *fh; cache_export(exp); - fh = cache_get_filehandle(exp, v3?64:32); + fh = cache_get_filehandle(exp, v3?64:32, p); if (fh == NULL) *error = NFSERR_ACCES; else