You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.6 KiB
149 lines
3.6 KiB
7 years ago
|
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. */
|