* [PATCH v2 0/3] Incremental against [exports] rootdir patchset @ 2019-06-04 17:57 Trond Myklebust 2019-06-04 17:57 ` [PATCH v2 1/3] mountd: Fix up incorrect comparison in next_mnt() Trond Myklebust 0 siblings, 1 reply; 4+ messages in thread From: Trond Myklebust @ 2019-06-04 17:57 UTC (permalink / raw) To: Steve Dickson; +Cc: J. Bruce Fields, linux-nfs These patches fix up a couple of bugs and issues against the [exports] rootdir patchset for nfs-utils. v2: - Fix nfsd_path_strip_root() return value, as pointed out by Bruce - Fix a strlen() bug in nfsd_path_strip_root() Trond Myklebust (3): mountd: Fix up incorrect comparison in next_mnt() mountd: Ensure nfsd_path_strip_root() uses the canonicalised path mountd: Canonicalise the rootdir in exportent_mkrealpath() support/export/export.c | 12 ++++++++++-- support/misc/nfsd_path.c | 17 ++++++++++++----- utils/mountd/cache.c | 8 +++++--- 3 files changed, 27 insertions(+), 10 deletions(-) -- 2.21.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/3] mountd: Fix up incorrect comparison in next_mnt() 2019-06-04 17:57 [PATCH v2 0/3] Incremental against [exports] rootdir patchset Trond Myklebust @ 2019-06-04 17:57 ` Trond Myklebust 2019-06-04 17:57 ` [PATCH v2 2/3] mountd: Ensure nfsd_path_strip_root() uses the canonicalised path Trond Myklebust 0 siblings, 1 reply; 4+ messages in thread From: Trond Myklebust @ 2019-06-04 17:57 UTC (permalink / raw) To: Steve Dickson; +Cc: J. Bruce Fields, linux-nfs We want to ensure that we compare the full name of the last component. Reported-by: "J. Bruce Fields" <bfields@redhat.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> --- utils/mountd/cache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index d818c971bded..d616d526667e 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -400,7 +400,7 @@ static char *next_mnt(void **v, char *p) while ((me = getmntent(f)) != NULL && l > 1) { mnt_dir = nfsd_path_strip_root(me->mnt_dir); - if (strncmp(mnt_dir, p, l) == 0 && mnt_dir[l] != '/') + if (strncmp(mnt_dir, p, l) == 0 && mnt_dir[l] == '/') return mnt_dir; } endmntent(f); -- 2.21.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 2/3] mountd: Ensure nfsd_path_strip_root() uses the canonicalised path 2019-06-04 17:57 ` [PATCH v2 1/3] mountd: Fix up incorrect comparison in next_mnt() Trond Myklebust @ 2019-06-04 17:57 ` Trond Myklebust 2019-06-04 17:57 ` [PATCH v2 3/3] mountd: Canonicalise the rootdir in exportent_mkrealpath() Trond Myklebust 0 siblings, 1 reply; 4+ messages in thread From: Trond Myklebust @ 2019-06-04 17:57 UTC (permalink / raw) To: Steve Dickson; +Cc: J. Bruce Fields, linux-nfs When attempting to strip the root path, we should first canonicalise the root pathname. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> --- support/misc/nfsd_path.c | 17 ++++++++++++----- utils/mountd/cache.c | 6 ++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/support/misc/nfsd_path.c b/support/misc/nfsd_path.c index 2f41a793c534..84e48028071c 100644 --- a/support/misc/nfsd_path.c +++ b/support/misc/nfsd_path.c @@ -1,6 +1,7 @@ #include <errno.h> #include <sys/types.h> #include <sys/stat.h> +#include <limits.h> #include <stdlib.h> #include <unistd.h> @@ -62,13 +63,19 @@ nfsd_path_nfsd_rootdir(void) char * nfsd_path_strip_root(char *pathname) { + char buffer[PATH_MAX]; const char *dir = nfsd_path_nfsd_rootdir(); - char *ret; - ret = strstr(pathname, dir); - if (!ret || ret != pathname) - return pathname; - return pathname + strlen(dir); + if (!dir) + goto out; + + if (realpath(dir, buffer)) + return strstr(pathname, buffer) == pathname ? + pathname + strlen(buffer) : NULL; + + xlog(D_GENERAL, "%s: failed to resolve path %s: %m", __func__, dir); +out: + return pathname; } char * diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index d616d526667e..ecda18c75a0f 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -390,7 +390,6 @@ static char *next_mnt(void **v, char *p) FILE *f; struct mntent *me; size_t l = strlen(p); - char *mnt_dir = NULL; if (*v == NULL) { f = setmntent("/etc/mtab", "r"); @@ -398,7 +397,10 @@ static char *next_mnt(void **v, char *p) } else f = *v; while ((me = getmntent(f)) != NULL && l > 1) { - mnt_dir = nfsd_path_strip_root(me->mnt_dir); + char *mnt_dir = nfsd_path_strip_root(me->mnt_dir); + + if (!mnt_dir) + continue; if (strncmp(mnt_dir, p, l) == 0 && mnt_dir[l] == '/') return mnt_dir; -- 2.21.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 3/3] mountd: Canonicalise the rootdir in exportent_mkrealpath() 2019-06-04 17:57 ` [PATCH v2 2/3] mountd: Ensure nfsd_path_strip_root() uses the canonicalised path Trond Myklebust @ 2019-06-04 17:57 ` Trond Myklebust 0 siblings, 0 replies; 4+ messages in thread From: Trond Myklebust @ 2019-06-04 17:57 UTC (permalink / raw) To: Steve Dickson; +Cc: J. Bruce Fields, linux-nfs Ensure that we canonicalise the export path when generating the real path. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> --- support/export/export.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/support/export/export.c b/support/export/export.c index 82bbb54c5e9e..c753f68e4d63 100644 --- a/support/export/export.c +++ b/support/export/export.c @@ -14,6 +14,7 @@ #include <sys/types.h> #include <sys/param.h> #include <netinet/in.h> +#include <limits.h> #include <stdlib.h> #include <dirent.h> #include <errno.h> @@ -21,6 +22,7 @@ #include "nfslib.h" #include "exportfs.h" #include "nfsd_path.h" +#include "xlog.h" exp_hash_table exportlist[MCL_MAXTYPES] = {{NULL, {{NULL,NULL}, }}, }; static int export_hash(char *); @@ -38,8 +40,14 @@ exportent_mkrealpath(struct exportent *eep) const char *chroot = nfsd_path_nfsd_rootdir(); char *ret = NULL; - if (chroot) - ret = nfsd_path_prepend_dir(chroot, eep->e_path); + if (chroot) { + char buffer[PATH_MAX]; + if (realpath(chroot, buffer)) + ret = nfsd_path_prepend_dir(buffer, eep->e_path); + else + xlog(D_GENERAL, "%s: failed to resolve path %s: %m", + __func__, chroot); + } if (!ret) ret = xstrdup(eep->e_path); eep->e_realpath = ret; -- 2.21.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-06-04 17:59 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-06-04 17:57 [PATCH v2 0/3] Incremental against [exports] rootdir patchset Trond Myklebust 2019-06-04 17:57 ` [PATCH v2 1/3] mountd: Fix up incorrect comparison in next_mnt() Trond Myklebust 2019-06-04 17:57 ` [PATCH v2 2/3] mountd: Ensure nfsd_path_strip_root() uses the canonicalised path Trond Myklebust 2019-06-04 17:57 ` [PATCH v2 3/3] mountd: Canonicalise the rootdir in exportent_mkrealpath() Trond Myklebust
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).