Blame bind-9.9.5-nonexistence-of-resolv-conf.patch

Tomas Hozza 01ddf2
From e3d1d75a58dcc6bdb7fa7a9a3147ffd297407c76 Mon Sep 17 00:00:00 2001
Tomas Hozza 01ddf2
From: Mark Andrews via RT <dhcp-bugs@isc.org>
Tomas Hozza 01ddf2
Date: Wed, 15 Jan 2014 02:30:27 +0000
Tomas Hozza 01ddf2
Subject: [PATCH] non-existance of resolv.conf should not be fatal
Tomas Hozza 01ddf2
Tomas Hozza 01ddf2
I've just put the following in for review.  The open question is whether
Tomas Hozza 01ddf2
we should return ISC_R_SUCCESS or some error code, when the file does not
Tomas Hozza 01ddf2
exist, and fix the callers.
Tomas Hozza 01ddf2
Tomas Hozza 01ddf2
This should be enough to allow you to continue testing.
Tomas Hozza 01ddf2
Tomas Hozza 01ddf2
Mark
Tomas Hozza 01ddf2
Tomas Hozza 01ddf2
commit 1992f682728798ef73db89351285f03de6d52043
Tomas Hozza 01ddf2
Author: Mark Andrews <marka@isc.org>
Tomas Hozza 01ddf2
Date:   Wed Jan 15 13:25:22 2014 +1100
Tomas Hozza 01ddf2
---
Tomas Hozza 01ddf2
 lib/irs/resconf.c | 75 +++++++++++++++++++++++++++++--------------------------
Tomas Hozza 01ddf2
 1 file changed, 40 insertions(+), 35 deletions(-)
Tomas Hozza 01ddf2
Tomas Hozza 01ddf2
diff --git a/lib/irs/resconf.c b/lib/irs/resconf.c
Tomas Hozza 01ddf2
index 88bdac1..8319dc6 100644
Tomas Hozza 01ddf2
--- a/lib/irs/resconf.c
Tomas Hozza 01ddf2
+++ b/lib/irs/resconf.c
Tomas Hozza 01ddf2
@@ -507,45 +507,50 @@ irs_resconf_load(isc_mem_t *mctx, const char *filename, irs_resconf_t **confp)
Tomas Hozza 01ddf2
 		conf->search[i] = NULL;
Tomas Hozza 01ddf2
 
Tomas Hozza 01ddf2
 	errno = 0;
Tomas Hozza 01ddf2
-	if ((fp = fopen(filename, "r")) == NULL) {
Tomas Hozza 01ddf2
-		isc_mem_put(mctx, conf, sizeof(*conf));
Tomas Hozza 01ddf2
-		return (ISC_R_INVALIDFILE);
Tomas Hozza 01ddf2
-	}
Tomas Hozza 01ddf2
-
Tomas Hozza 01ddf2
-	ret = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
-	do {
Tomas Hozza 01ddf2
-		stopchar = getword(fp, word, sizeof(word));
Tomas Hozza 01ddf2
-		if (stopchar == EOF) {
Tomas Hozza 01ddf2
-			rval = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
-			POST(rval);
Tomas Hozza 01ddf2
-			break;
Tomas Hozza 01ddf2
-		}
Tomas Hozza 01ddf2
-
Tomas Hozza 01ddf2
-		if (strlen(word) == 0U)
Tomas Hozza 01ddf2
-			rval = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
-		else if (strcmp(word, "nameserver") == 0)
Tomas Hozza 01ddf2
-			rval = resconf_parsenameserver(conf, fp);
Tomas Hozza 01ddf2
-		else if (strcmp(word, "domain") == 0)
Tomas Hozza 01ddf2
-			rval = resconf_parsedomain(conf, fp);
Tomas Hozza 01ddf2
-		else if (strcmp(word, "search") == 0)
Tomas Hozza 01ddf2
-			rval = resconf_parsesearch(conf, fp);
Tomas Hozza 01ddf2
-		else if (strcmp(word, "sortlist") == 0)
Tomas Hozza 01ddf2
-			rval = resconf_parsesortlist(conf, fp);
Tomas Hozza 01ddf2
-		else if (strcmp(word, "options") == 0)
Tomas Hozza 01ddf2
-			rval = resconf_parseoption(conf, fp);
Tomas Hozza 01ddf2
-		else {
Tomas Hozza 01ddf2
-			/* unrecognised word. Ignore entire line */
Tomas Hozza 01ddf2
-			rval = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
-			stopchar = eatline(fp);
Tomas Hozza 01ddf2
+	if ((fp = fopen(filename, "r")) != NULL) {
Tomas Hozza 01ddf2
+		ret = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
+		do {
Tomas Hozza 01ddf2
+			stopchar = getword(fp, word, sizeof(word));
Tomas Hozza 01ddf2
 			if (stopchar == EOF) {
Tomas Hozza 01ddf2
+				rval = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
+				POST(rval);
Tomas Hozza 01ddf2
 				break;
Tomas Hozza 01ddf2
 			}
Tomas Hozza 01ddf2
-		}
Tomas Hozza 01ddf2
-		if (ret == ISC_R_SUCCESS && rval != ISC_R_SUCCESS)
Tomas Hozza 01ddf2
-			ret = rval;
Tomas Hozza 01ddf2
-	} while (1);
Tomas Hozza 01ddf2
 
Tomas Hozza 01ddf2
-	fclose(fp);
Tomas Hozza 01ddf2
+			if (strlen(word) == 0U)
Tomas Hozza 01ddf2
+				rval = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
+			else if (strcmp(word, "nameserver") == 0)
Tomas Hozza 01ddf2
+				rval = resconf_parsenameserver(conf, fp);
Tomas Hozza 01ddf2
+			else if (strcmp(word, "domain") == 0)
Tomas Hozza 01ddf2
+				rval = resconf_parsedomain(conf, fp);
Tomas Hozza 01ddf2
+			else if (strcmp(word, "search") == 0)
Tomas Hozza 01ddf2
+				rval = resconf_parsesearch(conf, fp);
Tomas Hozza 01ddf2
+			else if (strcmp(word, "sortlist") == 0)
Tomas Hozza 01ddf2
+				rval = resconf_parsesortlist(conf, fp);
Tomas Hozza 01ddf2
+			else if (strcmp(word, "options") == 0)
Tomas Hozza 01ddf2
+				rval = resconf_parseoption(conf, fp);
Tomas Hozza 01ddf2
+			else {
Tomas Hozza 01ddf2
+				/* unrecognised word. Ignore entire line */
Tomas Hozza 01ddf2
+				rval = ISC_R_SUCCESS;
Tomas Hozza 01ddf2
+				stopchar = eatline(fp);
Tomas Hozza 01ddf2
+				if (stopchar == EOF) {
Tomas Hozza 01ddf2
+					break;
Tomas Hozza 01ddf2
+				}
Tomas Hozza 01ddf2
+			}
Tomas Hozza 01ddf2
+			if (ret == ISC_R_SUCCESS && rval != ISC_R_SUCCESS)
Tomas Hozza 01ddf2
+				ret = rval;
Tomas Hozza 01ddf2
+		} while (1);
Tomas Hozza 01ddf2
+
Tomas Hozza 01ddf2
+		fclose(fp);
Tomas Hozza 01ddf2
+	} else {
Tomas Hozza 01ddf2
+		switch (errno) {
Tomas Hozza 01ddf2
+		case ENOENT:
Tomas Hozza 01ddf2
+			break;
Tomas Hozza 01ddf2
+		default:
Tomas Hozza 01ddf2
+			isc_mem_put(mctx, conf, sizeof(*conf));
Tomas Hozza 01ddf2
+			return (ISC_R_INVALIDFILE);
Tomas Hozza 01ddf2
+		}
Tomas Hozza 01ddf2
+	}
Tomas Hozza 01ddf2
 
Tomas Hozza 01ddf2
 	/* If we don't find a nameserver fall back to localhost */
Tomas Hozza 01ddf2
 	if (conf->numns == 0) {
Tomas Hozza 01ddf2
-- 
Tomas Hozza 01ddf2
1.8.4.2
Tomas Hozza 01ddf2