diff options
author | Justin Mitchell <jumitche@rehat.com> | 2017-06-01 10:37:57 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2017-06-06 10:28:39 -0400 |
commit | 0276228a6f0ac390d3c3ed3502bb0d3ad73d093b (patch) | |
tree | f93391e1d9b937099b433854444efa76e1f4a987 /support/nfs/conffile.c | |
parent | db61c1a59b2b29e35a608c798159088a39347dea (diff) | |
download | nfs-utils-0276228a6f0ac390d3c3ed3502bb0d3ad73d093b.tar.gz nfs-utils-0276228a6f0ac390d3c3ed3502bb0d3ad73d093b.tar.xz nfs-utils-0276228a6f0ac390d3c3ed3502bb0d3ad73d093b.zip |
nfs.conf: Remove static variables in parsing routines
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@rehat.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'support/nfs/conffile.c')
-rw-r--r-- | support/nfs/conffile.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index efbdc8b..1b8881b 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -214,13 +214,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. */ @@ -247,12 +245,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 ']' */ @@ -262,18 +260,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) @@ -286,8 +285,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; @@ -297,7 +296,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; @@ -329,7 +328,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; } } @@ -348,6 +347,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) { @@ -357,7 +358,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; } } @@ -365,6 +366,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 |