Part of a sequence of attempts to tidy up the nfs.conf code and prepare it for use as part of a configuration API. Remove static vars that prevented memory cleanup and potentially lead to parsing errors if conf_init was called again. Signed-off-by: Justin Mitchell <jumitche@xxxxxxxxx> --- support/nfs/conffile.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index 1bc8c01..a76c7e3 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -212,13 +212,11 @@ conf_set_now(char *section, char *arg, char *tag, * headers and feed tag-value pairs into our configuration database. */ static void -conf_parse_line(int trans, char *line, size_t sz) +conf_parse_line(int trans, char *line, size_t sz, char **section, char **subsection) { char *val, *ptr; size_t i; size_t j; - static char *section = 0; - static char *arg = 0; static int ln = 0; /* Lines starting with '#' or ';' are comments. */ @@ -245,12 +243,12 @@ conf_parse_line(int trans, char *line, size_t sz) break; } } - if (section) - free(section); + if (*section) + free(*section); if (i == sz) { xlog_warn("config file error: line %d: " "non-matched ']', ignoring until next section", ln); - section = 0; + *section = NULL; return; } /* Strip off any blanks before ']' */ @@ -260,18 +258,19 @@ conf_parse_line(int trans, char *line, size_t sz) val++, j++; if (*val) i = j; - section = malloc(i+1); - if (!section) { + *section = malloc(i+1); + if (!*section) { xlog_warn("conf_parse_line: %d: malloc (%lu) failed", ln, (unsigned long)i); return; } - strncpy(section, line, i); - section[i] = '\0'; + strncpy(*section, line, i); + (*section)[i] = '\0'; - if (arg) - free(arg); - arg = 0; + if (*subsection) { + free(*subsection); + *subsection = NULL; + } ptr = strchr(val, '"'); if (ptr == NULL) @@ -284,8 +283,8 @@ conf_parse_line(int trans, char *line, size_t sz) "non-matched '\"', ignoring until next section", ln); } else { *ptr = '\0'; - arg = strdup(line); - if (!arg) + *subsection = strdup(line); + if (!*subsection) xlog_warn("conf_parse_line: %d: malloc arg failed", ln); } return; @@ -295,7 +294,7 @@ conf_parse_line(int trans, char *line, size_t sz) for (i = 0; i < sz; i++) { if (line[i] == '=') { /* If no section, we are ignoring the lines. */ - if (!section) { + if (!*section) { xlog_warn("config file error: line %d: " "ignoring line due to no section", ln); return; @@ -327,7 +326,7 @@ conf_parse_line(int trans, char *line, size_t sz) conf_load(trans, val); else /* XXX Perhaps should we not ignore errors? */ - conf_set(trans, section, arg, line, val, 0, 0); + conf_set(trans, *section, *subsection, line, val, 0, 0); return; } } @@ -346,6 +345,8 @@ conf_parse(int trans, char *buf, size_t sz) char *cp = buf; char *bufend = buf + sz; char *line; + char *section = NULL; + char *subsection = NULL; line = cp; while (cp < bufend) { @@ -355,7 +356,7 @@ conf_parse(int trans, char *buf, size_t sz) *(cp - 1) = *cp = ' '; else { *cp = '\0'; - conf_parse_line(trans, line, cp - line); + conf_parse_line(trans, line, cp - line, §ion, &subsection); line = cp + 1; } } @@ -363,6 +364,8 @@ conf_parse(int trans, char *buf, size_t sz) } if (cp != line) xlog_warn("conf_parse: last line non-terminated, ignored."); + if (section) free(section); + if (subsection) free(subsection); } static void -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html