@@ -170,10 +170,16 @@ char *lookup_entry(char *opt)
{
struct entry *entry;
- SLIST_FOREACH(entry, &head, entries) {
- if (strcasecmp(entry->opt, opt) == 0)
- return opt;
- }
+ if (strlen(opt) > 0 && opt[strlen(opt) - 1] == '=')
+ SLIST_FOREACH(entry, &head, entries) {
+ if (strncasecmp(entry->opt, opt, strlen(opt)) == 0)
+ return opt;
+ }
+ else
+ SLIST_FOREACH(entry, &head, entries) {
+ if (strcasecmp(entry->opt, opt) == 0)
+ return opt;
+ }
return NULL;
}
/*
@@ -300,13 +306,21 @@ conf_parse_mntopts(char *section, char *arg, char *opts)
if (opts && check_vers(opts, node->field))
continue;
- if (lookup_entry(node->field) != NULL)
+ if (lookup_entry(buf) != NULL)
continue;
buf[0] = '\0';
value = conf_get_section(section, arg, node->field);
if (value == NULL)
continue;
field = mountopts_alias(node->field, &argtype);
+ if (lookup_entry(field) != NULL)
+ continue;
+ if (argtype != MNT_NOARG) {
+ snprintf(buf, BUFSIZ, "no%s", field);
+ if (lookup_entry(buf) != NULL)
+ continue;
+ buf[0] = '\0';
+ }
if (strcasecmp(value, "false") == 0) {
if (argtype != MNT_NOARG)
snprintf(buf, BUFSIZ, "no%s", field);
conf_parse_mntopts() calls lookup_entry() in an attempt to avoid "overwriting" of mount options (actually it tries to avoid appending conflicting options to the string passed to mount(2)). Currently this doesn't do much of anything. For example, if you have Timeo=600 in the global section, Timeo=300 in the server-specific section, and Timeo=150 in the mountpoint-specific section, then the string that is passed to the mount syscall will contain "timeo=600,timeo=300,timeo=150". Note that the ordering of the conflicting options ensures that the correct option will ultimately be applied, but we should still avoid sending the conflicting options in the first place if possible. This patch fixes all but the MNT_NOARG type options (fg, bg, and sloppy). Signed-off-by: Scott Mayhew <smayhew@redhat.com> --- utils/mount/configfile.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-)