aboutsummaryrefslogtreecommitdiff
path: root/cddl/compat
diff options
context:
space:
mode:
authorAlan Somers <asomers@FreeBSD.org>2017-09-05 19:28:35 +0000
committerAlan Somers <asomers@FreeBSD.org>2017-09-05 19:28:35 +0000
commit0a7b460e7017217496633dbe71c4119cf66782dd (patch)
tree3c1bc9d5591a6f616d417613c650bbf4076bf553 /cddl/compat
parent1a11bb8f76916f91b15d957a90c7ee89a3c6a710 (diff)
downloadsrc-0a7b460e7017217496633dbe71c4119cf66782dd.tar.gz
src-0a7b460e7017217496633dbe71c4119cf66782dd.zip
Honor all options of "zfs mount -o"
The existing code in zmount incorrectly parses the comma-delimited option string. The result is that nmount only honors the last option. AFAICT the parsing has been broken ever since ZFS's initial import in change 168404. PR: 222078 Reviewed by: avg MFC after: 3 weeks Sponsored by: Spectra Logic Corp Differential Revision: https://reviews.freebsd.org/D12232
Notes
Notes: svn path=/head/; revision=323193
Diffstat (limited to 'cddl/compat')
-rw-r--r--cddl/compat/opensolaris/misc/zmount.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/cddl/compat/opensolaris/misc/zmount.c b/cddl/compat/opensolaris/misc/zmount.c
index d46b378ea92a..3c965b05d8b3 100644
--- a/cddl/compat/opensolaris/misc/zmount.c
+++ b/cddl/compat/opensolaris/misc/zmount.c
@@ -74,7 +74,7 @@ zmount(const char *spec, const char *dir, int mflag, char *fstype,
char *dataptr, int datalen, char *optptr, int optlen)
{
struct iovec *iov;
- char *optstr, *os, *p;
+ char *optstr, *os, *p, *tofree;
int iovlen, rv;
assert(spec != NULL);
@@ -87,7 +87,7 @@ zmount(const char *spec, const char *dir, int mflag, char *fstype,
assert(optptr != NULL);
assert(optlen > 0);
- optstr = strdup(optptr);
+ tofree = optstr = strdup(optptr);
assert(optstr != NULL);
iov = NULL;
@@ -98,11 +98,9 @@ zmount(const char *spec, const char *dir, int mflag, char *fstype,
build_iovec(&iov, &iovlen, "fspath", __DECONST(char *, dir),
(size_t)-1);
build_iovec(&iov, &iovlen, "from", __DECONST(char *, spec), (size_t)-1);
- for (p = optstr; p != NULL; strsep(&p, ",/ ")) {
- if (*p != '\0')
- build_iovec(&iov, &iovlen, p, NULL, (size_t)-1);
- }
+ while ((p = strsep(&optstr, ",/")) != NULL)
+ build_iovec(&iov, &iovlen, p, NULL, (size_t)-1);
rv = nmount(iov, iovlen, 0);
- free(optstr);
+ free(tofree);
return (rv);
}