diff -up libnfsidmap-0.25/cfg.c.orig libnfsidmap-0.25/cfg.c --- libnfsidmap-0.25/cfg.c.orig 2011-12-05 15:28:10.000000000 -0500 +++ libnfsidmap-0.25/cfg.c 2017-11-17 12:01:56.756692437 -0500 @@ -210,69 +210,98 @@ static void conf_parse_line (int trans, char *line, size_t sz) { char *val; - size_t i; - int j; + char *ptr; static char *section = 0; static int ln = 0; ln++; + /* Strip off any leading blanks */ + while (isblank(*line)) + line++; + + /* Lines starting with '#' or ';' are comments. */ if (*line == '#' || *line == ';') return; /* '[section]' parsing... */ - if (*line == '[') - { - for (i = 1; i < sz; i++) - if (line[i] == ']') - break; - if (section) - free (section); - if (i == sz) - { - warnx("conf_parse_line: %d:" - "non-matched ']', ignoring until next section", ln); - section = 0; - return; + if (*line == '[') { + line++; + + if (section) free(section); + + while (isblank(*line)) line++; + + /* find the closing ] */ + ptr = strchr(line, ']'); + + if (ptr == NULL) { + warnx("conf_parse_line: %d:" + "non-matched ']', ignoring until next section", ln); + section = NULL; + return; } - section = malloc (i); - if (!section) - { - warnx("conf_parse_line: %d: malloc (%lu) failed", ln, - (unsigned long)i); - return; + + /* just ignore everything after the closing ] */ + *(ptr--) = '\0'; + + /* strip off any blanks before ']' */ + while (ptr >= line && isblank(*ptr)) + *(ptr--) = '\0'; + + section = strdup(line); + if (!section) { + warnx("conf_parse_line: %d: malloc failed", ln); + } - strlcpy (section, line + 1, i); - return; - } + return; + } /* Deal with assignments. */ - for (i = 0; i < sz; i++) - if (line[i] == '=') - { - /* If no section, we are ignoring the lines. */ - if (!section) - { + ptr = strchr(line, '='); + + /* not an assignment line */ + if (ptr == NULL) { + /* and not just whitespace either, weird */ + if (line[strspn(line, " \t")]) + warnx("conf_parse_line: %d: syntax error", ln); + return; + } + + /* If no section, we are ignoring the lines. */ + if (!section) { warnx("conf_parse_line: %d: ignoring line due to no section", ln); return; - } - line[strcspn (line, " \t=")] = '\0'; - val = line + i + 1 + strspn (line + i + 1, " \t"); - /* Skip trailing whitespace, if any */ - for (j = sz - (val - line) - 1; j > 0 && isspace (val[j]); j--) - val[j] = '\0'; - /* XXX Perhaps should we not ignore errors? */ - conf_set (trans, section, line, val, 0, 0); - return; - } - - /* Other non-empty lines are weird. */ - i = strspn (line, " \t"); - if (line[i]) - warnx("conf_parse_line: %d: syntax error", ln); + } - return; + val = ptr + 1; + *(ptr--) = '\0'; + + /* strip spaces before and after the = */ + while (ptr >= line && isblank(*ptr)) + *(ptr--) = '\0'; + while (*val != '\0' && isblank(*val)) + val++; + + /* trim any trailing spaces or comments */ + if ((ptr=strchr(val, '#'))!=NULL) *ptr = '\0'; + if ((ptr=strchr(val, ';'))!=NULL) *ptr = '\0'; + ptr = val + strlen(val) - 1; + while (ptr > val && isspace(*ptr)) + *(ptr--) = '\0'; + + if (*line == '\0') { + warnx("conf_parse_line: %d: missing tag in assignment", ln); + return; + } + if (*val == '\0') { + warnx("conf_parse_line: %d: missing value in assignment", ln); + return; + } + + /* XXX Perhaps should we not ignore errors? */ + conf_set (trans, section, line, val, 0, 0); } /* Parse the mapped configuration file. */