summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorneilbrown <neilbrown>2003-05-23 03:58:39 +0000
committerneilbrown <neilbrown>2003-05-23 03:58:39 +0000
commit936ecbb5750e0e29b9e2464998a8e03eca617b72 (patch)
treea3ec3637e785c3a053b7b74d5aff3a201fcdfedf
parent5272be95bf48cb4e9f8579105a79522e88b695f4 (diff)
downloadnfs-utils-936ecbb5750e0e29b9e2464998a8e03eca617b72.tar.gz
-rw-r--r--ChangeLog11
-rw-r--r--utils/mountd/cache.c4
-rw-r--r--utils/mountd/mountd.c16
3 files changed, 26 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 09277b3..60fd487 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2003-05-23 NeilBrown <neilb@cse.unsw.edu.au>
+
+ * 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 <neilb@cse.unsw.edu.au>
* 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