svn commit: r270454 - head/usr.sbin/autofs

Edward Tomasz Napierala trasz at FreeBSD.org
Sun Aug 24 12:32:27 UTC 2014


Author: trasz
Date: Sun Aug 24 12:32:26 2014
New Revision: 270454
URL: http://svnweb.freebsd.org/changeset/base/270454

Log:
  Fix handling of keys in executable maps.  Previously it was broken for keys
  containing whitespace.
  
  PR:		192947
  MFC after:	2 weeks
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/usr.sbin/autofs/common.c

Modified: head/usr.sbin/autofs/common.c
==============================================================================
--- head/usr.sbin/autofs/common.c	Sun Aug 24 10:40:13 2014	(r270453)
+++ head/usr.sbin/autofs/common.c	Sun Aug 24 12:32:26 2014	(r270454)
@@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
 #include <signal.h>
 #include <stdbool.h>
 #include <stdint.h>
+#define	_WITH_GETLINE
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -213,6 +214,7 @@ node_new(struct node *parent, char *key,
 
 	TAILQ_INIT(&n->n_children);
 	assert(key != NULL);
+	assert(key[0] != '\0');
 	n->n_key = key;
 	if (options != NULL)
 		n->n_options = options;
@@ -243,6 +245,7 @@ node_new_map(struct node *parent, char *
 
 	TAILQ_INIT(&n->n_children);
 	assert(key != NULL);
+	assert(key[0] != '\0');
 	n->n_key = key;
 	if (options != NULL)
 		n->n_options = options;
@@ -565,6 +568,7 @@ node_path_x(const struct node *n, char *
 		return (x);
 	}
 
+	assert(n->n_key[0] != '\0');
 	path = separated_concat(n->n_key, x, '/');
 	free(x);
 
@@ -857,33 +861,44 @@ again:
 }
 
 /*
- * Parse output of a special map called without argument.  This is just
- * a list of keys.
+ * Parse output of a special map called without argument.  It is a list
+ * of keys, separated by newlines.  They can contain whitespace, so use
+ * getline(3) instead of lexer used for maps.
  */
 static void
 parse_map_keys_yyin(struct node *parent, const char *map)
 {
-	char *key = NULL;
-	int ret;
+	char *line = NULL, *key;
+	size_t linecap = 0;
+	ssize_t linelen;
 
 	lineno = 1;
 
 	for (;;) {
-		ret = yylex();
-
-		if (ret == NEWLINE)
-			continue;
-
-		if (ret == 0) {
+		linelen = getline(&line, &linecap, yyin);
+		if (linelen < 0) {
 			/*
 			 * End of file.
 			 */
 			break;
 		}
+		if (linelen <= 1) {
+			/*
+			 * Empty line, consisting of just the newline.
+			 */
+			continue;
+		}
+
+		/*
+		 * "-1" to strip the trailing newline.
+		 */
+		key = strndup(line, linelen - 1);
 
-		key = checked_strdup(yytext);
+		log_debugx("adding key \"%s\"", key);
 		node_new(parent, key, NULL, NULL, map, lineno);
+		lineno++;
 	}
+	free(line);
 }
 
 static bool


More information about the svn-src-all mailing list