diff options
author | Yang Tse <yangsita@gmail.com> | 2010-12-10 21:19:51 +0100 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2010-12-10 21:19:51 +0100 |
commit | b2dafb6974da4f3b80dda3bd343989157d8c36a0 (patch) | |
tree | ef423d62792967aadbc0cf4cefd4ea4865395079 | |
parent | 0b497f70e19511a73d365a5c3c8c236343165d90 (diff) | |
download | c-ares-b2dafb6974da4f3b80dda3bd343989157d8c36a0.tar.gz c-ares-b2dafb6974da4f3b80dda3bd343989157d8c36a0.tar.bz2 c-ares-b2dafb6974da4f3b80dda3bd343989157d8c36a0.zip |
ares_init: fix detection of semicolon comments in resolv.conf
File resolv.conf may either use a hash '#' or a semicolon ';' character as an
indication that the rest of the line is a comment. This fixes not recognizing
the semicolon as a valid comment indicator in resolv.conf.
-rw-r--r-- | CHANGES | 8 | ||||
-rw-r--r-- | RELEASE-NOTES | 4 | ||||
-rw-r--r-- | ares_init.c | 35 |
3 files changed, 33 insertions, 14 deletions
@@ -1,5 +1,13 @@ Changelog for the c-ares project +Changed: + + o + +Fixed: + + o detection of semicolon comments in resolv.conf + Version 1.7.4 (December 9, 2010) Changed: diff --git a/RELEASE-NOTES b/RELEASE-NOTES index f090a5f..83258cb 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -6,8 +6,10 @@ Changed: Fixed: - o + o detection of semicolon comments in resolv.conf Thanks go to these friendly people for their efforts and contributions: + Yang Tse + Have fun! diff --git a/ares_init.c b/ares_init.c index d7954a0..a10f7f3 100644 --- a/ares_init.c +++ b/ares_init.c @@ -102,7 +102,7 @@ static int config_lookup(ares_channel channel, const char *str, const char *bindch, const char *filech); static int config_sortlist(struct apattern **sortlist, int *nsort, const char *str); -static char *try_config(char *s, const char *opt); +static char *try_config(char *s, const char *opt, char scc); #endif #define ARES_CONFIG_CHECK(x) (x->lookups && x->nsort > -1 && \ @@ -856,17 +856,19 @@ DhcpNameServer if (fp) { while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "domain"))) + if ((p = try_config(line, "domain", ';'))) status = config_domain(channel, p); - else if ((p = try_config(line, "lookup")) && !channel->lookups) + else if ((p = try_config(line, "lookup", ';')) && !channel->lookups) status = config_lookup(channel, p, "bind", "file"); - else if ((p = try_config(line, "search"))) + else if ((p = try_config(line, "search", ';'))) status = set_search(channel, p); - else if ((p = try_config(line, "nameserver")) && channel->nservers == -1) + else if ((p = try_config(line, "nameserver", ';')) && + channel->nservers == -1) status = config_nameserver(&servers, &nservers, p); - else if ((p = try_config(line, "sortlist")) && channel->nsort == -1) + else if ((p = try_config(line, "sortlist", ';')) && + channel->nsort == -1) status = config_sortlist(&sortlist, &nsort, p); - else if ((p = try_config(line, "options"))) + else if ((p = try_config(line, "options", ';'))) status = set_options(channel, p); else status = ARES_SUCCESS; @@ -896,7 +898,7 @@ DhcpNameServer if (fp) { while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "hosts:")) && !channel->lookups) + if ((p = try_config(line, "hosts:", '\0')) && !channel->lookups) status = config_lookup(channel, p, "dns", "files"); } fclose(fp); @@ -923,7 +925,7 @@ DhcpNameServer if (fp) { while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "order")) && !channel->lookups) + if ((p = try_config(line, "order", '\0')) && !channel->lookups) status = config_lookup(channel, p, "bind", "hosts"); } fclose(fp); @@ -950,7 +952,7 @@ DhcpNameServer if (fp) { while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) { - if ((p = try_config(line, "hosts=")) && !channel->lookups) + if ((p = try_config(line, "hosts=", '\0')) && !channel->lookups) status = config_lookup(channel, p, "bind", "local"); } fclose(fp); @@ -1426,7 +1428,7 @@ static const char *try_option(const char *p, const char *q, const char *opt) } #if !defined(WIN32) && !defined(WATT32) -static char *try_config(char *s, const char *opt) +static char *try_config(char *s, const char *opt, char scc) { size_t len; char *p; @@ -1436,10 +1438,17 @@ static char *try_config(char *s, const char *opt) /* no line or no option */ return NULL; + /* Hash '#' character is always used as primary comment char, additionally + a not-NUL secondary comment char will be considered when specified. */ + /* trim line comment */ p = s; - while (*p && (*p != '#')) - p++; + if(scc) + while (*p && (*p != '#') && (*p != scc)) + p++; + else + while (*p && (*p != '#')) + p++; *p = '\0'; /* trim trailing whitespace */ |