linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Justin Mitchell <jumitche@redhat.com>
To: "linux-nfs@vger.kernel.org" <linux-nfs@vger.kernel.org>
Subject: [PATCH 1/3] nfs.conf tidy ups
Date: Mon, 22 May 2017 16:48:42 +0100	[thread overview]
Message-ID: <1495468122.4169.8.camel@redhat.com> (raw)

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>

---
 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, &section, &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




             reply	other threads:[~2017-05-22 15:48 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-22 15:48 Justin Mitchell [this message]
2017-06-06 14:36 ` [PATCH 1/3] nfs.conf tidy ups Steve Dickson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1495468122.4169.8.camel@redhat.com \
    --to=jumitche@redhat.com \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).