From: Miek Gieben Date: Thu, 23 Mar 2006 10:48:58 +0000 (+0000) Subject: handle comments in resolv.conf and be much more robust X-Git-Tag: release-1.1.0~279 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=090bae3ec2d20bb0608381ceca37bd2008663024;p=thirdparty%2Fldns.git handle comments in resolv.conf and be much more robust --- diff --git a/examples/Makefile.in b/examples/Makefile.in index 5dd5efdd..5e59710b 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -38,6 +38,7 @@ SOURCES = ldns-read-zone.c \ ldns-zsplit.c \ ldns-zcat.c \ ldns-dpa.c \ + ldns-resolver.c \ ldnsd.c @@ -92,6 +93,9 @@ ldnsd: ldnsd.o ldns-threshold-update: ldns-threshold-update.o $(LINK) -o $@ $+ +ldns-resolver: ldns-resolver.o + $(LINK) -o $@ $+ + ## implicit rule %.o: $(srcdir)/%.c $(COMPILE) -c $< diff --git a/parse.c b/parse.c index d682752c..933ccc18 100644 --- a/parse.c +++ b/parse.c @@ -102,9 +102,9 @@ ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *li /* check if we hit the delim */ for (d = del; *d; d++) { - if (c == *d && i >= 1) { + if (c == *d && i >= 1) { goto tokenread; - } + } } if (c != '\0' && c != '\n') { *t++ = c; diff --git a/resolver.c b/resolver.c index dfdd138d..9651cd84 100644 --- a/resolver.c +++ b/resolver.c @@ -579,7 +579,14 @@ ldns_resolver_new_frm_fp_l(FILE *fp, int *line_nr) } gtr = ldns_fget_token_l(fp, word, LDNS_PARSE_NORMAL, 0, line_nr); while (gtr > 0) { - /* do something */ + /* check comments */ + if (word[0] == '#') { + /* read the rest of the line, should be 1 word */ + gtr = ldns_fget_token_l(fp, word, LDNS_PARSE_NORMAL, 0, line_nr); + /* prepare the next string for furhter parsing */ + gtr = ldns_fget_token_l(fp, word, LDNS_PARSE_NORMAL, 0, line_nr); + continue; + } switch(expect) { case LDNS_RESOLV_KEYWORD: /* keyword */ @@ -594,18 +601,19 @@ ldns_resolver_new_frm_fp_l(FILE *fp, int *line_nr) } /* no keyword recognized */ if (expect == LDNS_RESOLV_KEYWORD) { - /* dprintf("[%s] unreg keyword\n", word); */ + LDNS_FREE(word); + return NULL; } break; case LDNS_RESOLV_DEFDOMAIN: /* default domain dname */ tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word); if (!tmp) { - expect = LDNS_RESOLV_KEYWORD; - break; + LDNS_FREE(word); + return NULL; } - /* don't free, because we copy the pointer */ + /* DOn't free, because we copy the pointer */ ldns_resolver_set_domain(r, tmp); expect = LDNS_RESOLV_KEYWORD; break; @@ -616,9 +624,10 @@ ldns_resolver_new_frm_fp_l(FILE *fp, int *line_nr) /* try ip4 */ tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, word); } + /* could not parse it, exit */ if (!tmp) { - expect = LDNS_RESOLV_KEYWORD; - break; + LDNS_FREE(word); + return NULL; } (void)ldns_resolver_push_nameserver(r, tmp); ldns_rdf_deep_free(tmp); @@ -628,19 +637,14 @@ ldns_resolver_new_frm_fp_l(FILE *fp, int *line_nr) /* search list domain dname, will only work with 1 name! */ tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word); if (!tmp) { - expect = LDNS_RESOLV_KEYWORD; - break; + LDNS_FREE(word); + return NULL; } ldns_resolver_push_searchlist(r, tmp); ldns_rdf_deep_free(tmp); expect = LDNS_RESOLV_KEYWORD; break; - default: - /* huh?! */ - /* dprintf("%s", "BIG FAT WARNING should never reach this\n"); */ - expect = LDNS_RESOLV_KEYWORD; - break; } gtr = ldns_fget_token_l(fp, word, LDNS_PARSE_NORMAL, 0, line_nr); }