git: 154ad8e0f88f - main - Revert "Issue #237 : Resolver uses nameserver commented out in /etc/resolv.conf"

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Wed, 15 May 2024 10:10:26 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=154ad8e0f88ffc07b6d06686f53bfc22927d3ad8

commit 154ad8e0f88ffc07b6d06686f53bfc22927d3ad8
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2024-05-15 10:10:20 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2024-05-15 10:10:20 +0000

    Revert "Issue #237 : Resolver uses nameserver commented out in /etc/resolv.conf"
    
    This reverts commit b5fb1f44ed435fa25fe3de87c9b9ee6c0aad5125.
---
 contrib/ldns/parse.c    | 35 ++++---------------------------
 contrib/ldns/resolver.c | 55 +++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 48 insertions(+), 42 deletions(-)

diff --git a/contrib/ldns/parse.c b/contrib/ldns/parse.c
index af8b2c1321b2..9698ba71e881 100644
--- a/contrib/ldns/parse.c
+++ b/contrib/ldns/parse.c
@@ -27,14 +27,9 @@ ldns_fget_token(FILE *f, char *token, const char *delim, size_t limit)
 	return ldns_fget_token_l(f, token, delim, limit, NULL);
 }
 
-enum file_type2parse {
-	zone_file_type, resolv_conf_file_type
-};
-
-static ldns_status
-ldns_fget_token_l_st_file_type(FILE *f, char **token, size_t *limit,
-		bool fixed, const char *delim, int *line_nr,
-		enum file_type2parse file_type)
+ldns_status
+ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, bool fixed
+                    , const char *delim, int *line_nr)
 {
 	int c, prev_c;
 	int p; /* 0 -> no parentheses seen, >0 nr of ( seen */
@@ -103,9 +98,7 @@ ldns_fget_token_l_st_file_type(FILE *f, char **token, size_t *limit,
 		}
 
 		/* do something with comments ; */
-		if ((c == ';'
-		||  (c == '#' && file_type == resolv_conf_file_type))
-				&& quoted == 0) {
+		if (c == ';' && quoted == 0) {
 			if (prev_c != '\\') {
 				com = 1;
 			}
@@ -222,26 +215,6 @@ tokenread:
 	return i == 0 ? LDNS_STATUS_SYNTAX_EMPTY : LDNS_STATUS_OK;
 }
 
-ldns_status
-ldns_fget_token_l_st(FILE *f, char **token, size_t *limit, bool fixed
-                    , const char *delim, int *line_nr)
-{
-	return ldns_fget_token_l_st_file_type(
-		f, token, limit, fixed, delim, line_nr, zone_file_type);
-}
-
-ssize_t
-ldns_fget_token_l_resolv_conf(FILE *f, char *token, const char *delim,
-		size_t limit, int *line_nr)
-{
-	if (limit == 0)
-		limit = LDNS_MAX_LINELEN;
-	if (ldns_fget_token_l_st_file_type(f, &token, &limit, true, delim,
-				line_nr, resolv_conf_file_type))
-		return -1;
-	else
-		return (ssize_t)strlen(token);
-}
 
 ssize_t
 ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr)
diff --git a/contrib/ldns/resolver.c b/contrib/ldns/resolver.c
index 4b398abb4418..f9ec65a55966 100644
--- a/contrib/ldns/resolver.c
+++ b/contrib/ldns/resolver.c
@@ -761,8 +761,6 @@ ldns_resolver_new_frm_fp(ldns_resolver **res, FILE *fp)
 	return ldns_resolver_new_frm_fp_l(res, fp, NULL);
 }
 
-ssize_t ldns_fget_token_l_resolv_conf(FILE *f, char *token, const char *delim,
-		size_t limit, int *line_nr);
 ldns_status
 ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 {
@@ -777,7 +775,7 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 #endif
 	ssize_t gtr, bgtr;
 	ldns_buffer *b;
-        int lnr = 0;
+        int lnr = 0, oldline;
 	FILE* myfp = fp;
         if(!line_nr) line_nr = &lnr;
 
@@ -811,18 +809,36 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 
 	gtr = 1;
 	word[0] = 0;
+        oldline = *line_nr;
         expect = LDNS_RESOLV_KEYWORD;
 	while (gtr > 0) {
+		/* check comments */
+		if (word[0] == '#') {
+                        word[0]='x';
+                        if(oldline == *line_nr) {
+                                /* skip until end of line */
+                                int c;
+                                do {
+                                        c = fgetc(myfp);
+                                } while(c != EOF && c != '\n');
+                                if(c=='\n') (*line_nr)++;
+                        }
+			/* and read next to prepare for further parsing */
+                        oldline = *line_nr;
+			continue;
+		}
+                oldline = *line_nr;
 		switch(expect) {
 			case LDNS_RESOLV_KEYWORD:
 				/* keyword */
-				gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
+				gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
 				if (gtr != 0) {
+                                        if(word[0] == '#') continue;
 					for(i = 0; i < LDNS_RESOLV_KEYWORDS; i++) {
 						if (strcasecmp(keyword[i], word) == 0) {
 							/* chosen the keyword and
 							 * expect values carefully
-							 */
+	        					 */
 							expect = i;
 							break;
 						}
@@ -840,12 +856,16 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 				break;
 			case LDNS_RESOLV_DEFDOMAIN:
 				/* default domain dname */
-				gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
+				gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
 				if (gtr == 0) {
 					if(!fp) fclose(myfp);
 					ldns_resolver_deep_free(r);
 					return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
 				}
+                                if(word[0] == '#') {
+                                        expect = LDNS_RESOLV_KEYWORD;
+                                        continue;
+                                }
 				tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word);
 				if (!tmp) {
 					if(!fp) fclose(myfp);
@@ -859,12 +879,16 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 				break;
 			case LDNS_RESOLV_NAMESERVER:
 				/* NS aaaa or a record */
-				gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
+				gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
 				if (gtr == 0) {
 					if(!fp) fclose(myfp);
 					ldns_resolver_deep_free(r);
 					return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
 				}
+                                if(word[0] == '#') {
+                                        expect = LDNS_RESOLV_KEYWORD;
+                                        continue;
+                                }
                                 if(strchr(word, '%')) {
                                         /* snip off interface labels,
                                          * fe80::222:19ff:fe31:4222%eth0 */
@@ -887,7 +911,7 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 				break;
 			case LDNS_RESOLV_SEARCH:
 				/* search list domain dname */
-				gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
+				gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
 				b = LDNS_MALLOC(ldns_buffer);
 				if(!b) {
 					ldns_resolver_deep_free(r);
@@ -905,6 +929,10 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 				bgtr = ldns_bget_token(b, word, LDNS_PARSE_NORMAL, (size_t) gtr + 1);
 				while (bgtr > 0) {
 					gtr -= bgtr;
+                                        if(word[0] == '#') {
+                                                expect = LDNS_RESOLV_KEYWORD;
+                                                break;
+                                        }
 					tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word);
 					if (!tmp) {
 						ldns_resolver_deep_free(r);
@@ -926,23 +954,28 @@ ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr)
 				}
 				break;
 			case LDNS_RESOLV_SORTLIST:
-				gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
+				gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
 				/* sortlist not implemented atm */
 				expect = LDNS_RESOLV_KEYWORD;
 				break;
 			case LDNS_RESOLV_OPTIONS:
-				gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
+				gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr);
 				/* options not implemented atm */
 				expect = LDNS_RESOLV_KEYWORD;
 				break;
 			case LDNS_RESOLV_ANCHOR:
 				/* a file containing a DNSSEC trust anchor */
-				gtr = ldns_fget_token_l_resolv_conf(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
+				gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr);
 				if (gtr == 0) {
 					ldns_resolver_deep_free(r);
 					if(!fp) fclose(myfp);
 					return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR;
 				}
+                                if(word[0] == '#') {
+                                        expect = LDNS_RESOLV_KEYWORD;
+                                        continue;
+                                }
+
 #ifdef HAVE_SSL
 				tmp_rr = ldns_read_anchor_file(word);
 				(void) ldns_resolver_push_dnssec_anchor(r, tmp_rr);