All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.