Context Mounts and Unsupported Contexts: nfs-utils
RFC PATCH 3/3 Context Mounts and Unsupported Contexts: nfs-utils
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(-)
utils/mount/mount.c +20 -2
@@ -275,12 +275,30 @@ static void parse_opts (const char *optichar *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); }
utils/mount/nfsmount.c +34 -5
@@ -550,12 +550,28 @@ parse_options(char *old_opts, struct nfschar *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))