* [RFC Patch 3/3] Context Mounts and Unsupported Contexts: nfs-utils
@ 2006-08-15 15:56 Cory Olmo
0 siblings, 0 replies; only message in thread
From: Cory Olmo @ 2006-08-15 15:56 UTC (permalink / raw)
To: selinux
[-- Attachment #1: Type: text/plain, Size: 290 bytes --]
This patch performs the same type of modifications to option parsing as done
to util-linux.
nfs-utils/utils/mount/mount.c | 22 ++++++++++++++++++++--
nfs-utils/utils/mount/nfsmount.c | 39 ++++++++++++++++++++++++++++++++++-----
2 files changed, 54 insertions(+), 7 deletions(-)
[-- Attachment #2: nfs-utils-1.0.9-quoted_context.patch --]
[-- Type: text/x-patch, Size: 3002 bytes --]
diff --git a/utils/mount/mount.c b/utils/mount/mount.c
index a10b398..86899a7 100644
--- a/utils/mount/mount.c
+++ b/utils/mount/mount.c
@@ -275,12 +275,30 @@ static void parse_opts (const char *opti
char *opts = xstrdup(options);
char *opt;
int len = strlen(opts) + 20;
+ int open_quote = 0;
+ char *opt_start = NULL;
+ char *opt_end = NULL;
*extra_opts = xmalloc(len);
**extra_opts = '\0';
- for (opt = strtok(opts, ","); opt; opt = strtok(NULL, ","))
- parse_opt(opt, flags, *extra_opts, len);
+ opt_start = opt_end = opts;
+ do {
+ if ((*opt_end == '"')) {
+ if (open_quote < 0)
+ open_quote += 1;
+ else
+ open_quote -= 1;
+ }
+ if (((*opt_end == ',') && (open_quote == 0)) ||
+ *opt_end == '\0') {
+ opt = xstrndup(opt_start, opt_end - opt_start);
+ parse_opt(opt, flags, *extra_opts, len);
+ opt_start = opt_end + 1;
+ free(opt);
+ opt = NULL;
+ }
+ } while (*opt_end++);
free(opts);
}
diff --git a/utils/mount/nfsmount.c b/utils/mount/nfsmount.c
index fb40bc8..0b44492 100644
--- a/utils/mount/nfsmount.c
+++ b/utils/mount/nfsmount.c
@@ -550,12 +550,28 @@ parse_options(char *old_opts, struct nfs
char *opt, *opteq;
char *mounthost = NULL;
char cbuf[128];
+ char *opt_start, *opt_end;
+ int open_quote = 0;
data->flags = 0;
*bg = 0;
len = strlen(new_opts);
- for (opt = strtok(old_opts, ","); opt; opt = strtok(NULL, ",")) {
+ opt_start = opt_end = old_opts;
+ do {
+ if ((*opt_end == '"')) {
+ if (open_quote < 0)
+ open_quote += 1;
+ else
+ open_quote -= 1;
+ }
+ if (!(((*opt_end == ',') && (open_quote == 0)) ||
+ *opt_end == '\0')) {
+ continue;
+ }
+ opt = xstrndup(opt_start, opt_end - opt_start);
+ opt_start = opt_end + 1;
+
if (strlen(opt) >= sizeof(cbuf))
goto bad_parameter;
if ((opteq = strchr(opt, '=')) && isdigit(opteq[1])) {
@@ -670,14 +686,24 @@ #endif
strcspn(opteq+1," \t\n\r,"));
else if (!strcmp(opt, "context")) {
char *context = opteq + 1;
-
+
+ /* XXX: The size of cbuf would have to be
+ * more than doubled or NFS_MAX_CONTEXT_LEN
+ * reduced to <128 before this would ever be
+ * a factor.
+ */
if (strlen(context) > NFS_MAX_CONTEXT_LEN) {
printf(_("context parameter exceeds limit of %d\n"),
NFS_MAX_CONTEXT_LEN);
goto bad_parameter;
}
- strncpy(data->context, context, NFS_MAX_CONTEXT_LEN);
- } else
+ /* The context string is in the format of
+ * "system_u:object_r:...". We only want
+ * the context str between the quotes.
+ */
+ strncpy(data->context, context+1,
+ strlen(context)-2);
+ } else
goto bad_parameter;
sprintf(cbuf, "%s=%s,", opt, opteq+1);
} else {
@@ -780,7 +806,10 @@ #endif
goto out_bad;
}
strcat(new_opts, cbuf);
- }
+ free(opt);
+ opt = NULL;
+ } while (*opt_end++);
+
/* See if the nfs host = mount host. */
if (mounthost) {
if (!nfs_gethostbyname(mounthost, mnt_saddr))
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2006-08-15 15:57 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-15 15:56 [RFC Patch 3/3] Context Mounts and Unsupported Contexts: nfs-utils Cory Olmo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.