Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Oct 2014 11:06:55 +0000 (UTC)
From:      Dag-Erling Smørgrav <des@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r273273 - head/contrib/openpam/lib/libpam
Message-ID:  <201410191106.s9JB6toW053761@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: des
Date: Sun Oct 19 11:06:54 2014
New Revision: 273273
URL: https://svnweb.freebsd.org/changeset/base/273273

Log:
  Merge upstream r825: fix line continuation in whitespace

Modified:
  head/contrib/openpam/lib/libpam/openpam_readword.c
Directory Properties:
  head/contrib/openpam/   (props changed)

Modified: head/contrib/openpam/lib/libpam/openpam_readword.c
==============================================================================
--- head/contrib/openpam/lib/libpam/openpam_readword.c	Sun Oct 19 08:47:27 2014	(r273272)
+++ head/contrib/openpam/lib/libpam/openpam_readword.c	Sun Oct 19 11:06:54 2014	(r273273)
@@ -55,18 +55,35 @@ openpam_readword(FILE *f, int *lineno, s
 {
 	char *word;
 	size_t size, len;
-	int ch, comment, escape, quote;
+	int ch, escape, quote;
 	int serrno;
 
 	errno = 0;
 
 	/* skip initial whitespace */
-	comment = 0;
-	while ((ch = getc(f)) != EOF && ch != '\n') {
-		if (ch == '#')
-			comment = 1;
-		if (!is_lws(ch) && !comment)
+	escape = quote = 0;
+	while ((ch = getc(f)) != EOF) {
+		if (ch == '\n') {
+			/* either EOL or line continuation */
+			if (!escape)
+				break;
+			if (lineno != NULL)
+				++*lineno;
+			escape = 0;
+		} else if (escape) {
+			/* escaped something else */
+			break;
+		} else if (ch == '#') {
+			/* comment: until EOL, no continuation */
+			while ((ch = getc(f)) != EOF)
+				if (ch == '\n')
+					break;
 			break;
+		} else if (ch == '\\') {
+			escape = 1;
+		} else if (!is_ws(ch)) {
+			break;
+		}
 	}
 	if (ch == EOF)
 		return (NULL);
@@ -76,7 +93,6 @@ openpam_readword(FILE *f, int *lineno, s
 
 	word = NULL;
 	size = len = 0;
-	escape = quote = 0;
 	while ((ch = fgetc(f)) != EOF && (!is_ws(ch) || quote || escape)) {
 		if (ch == '\\' && !escape && quote != '\'') {
 			/* escape next character */
@@ -90,7 +106,7 @@ openpam_readword(FILE *f, int *lineno, s
 		} else if (ch == quote && !escape) {
 			/* end quote */
 			quote = 0;
-		} else if (ch == '\n' && escape && quote != '\'') {
+		} else if (ch == '\n' && escape) {
 			/* line continuation */
 			escape = 0;
 		} else {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201410191106.s9JB6toW053761>