From a60c9ef88e7577462b0b7801ac2b57ebcd4d351e Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Mon, 5 May 2008 17:48:25 +0000 Subject: Improved parsing of resolver configuration files --- ares/ares_init.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 7 deletions(-) (limited to 'ares/ares_init.c') diff --git a/ares/ares_init.c b/ares/ares_init.c index 583f98f45..9b655a867 100644 --- a/ares/ares_init.c +++ b/ares/ares_init.c @@ -1245,16 +1245,61 @@ static int set_options(ares_channel channel, const char *str) static char *try_config(char *s, const char *opt) { size_t len; + ssize_t i; + ssize_t j; + char *p; - len = strlen(opt); - if (strncmp(s, opt, len) != 0 || !ISSPACE(s[len])) + if (!s || !opt) + /* no line or no option */ + return NULL; + + /* trim line comment */ + for (i = 0; s[i] && s[i] != '#'; ++i); + s[i] = '\0'; + + /* trim trailing whitespace */ + for (j = i-1; j >= 0 && ISSPACE(s[j]); --j); + s[++j] = '\0'; + + /* skip leading whitespace */ + for (i = 0; s[i] && ISSPACE(s[i]); ++i); + p = &s[i]; + + if (!*p) + /* empty line */ + return NULL; + + if ((len = strlen(opt)) == 0) + /* empty option */ + return NULL; + + if (strncmp(p, opt, len) != 0) + /* line and option do not match */ return NULL; - s += len; - while (ISSPACE(*s)) - s++; - return s; -} + /* skip over given option name */ + p += len; + + if (!*p) + /* no option value */ + return NULL; + + if ((opt[len-1] != ':') && (opt[len-1] != '=') && !ISSPACE(*p)) + /* whitespace between option name and value is mandatory + for given option names which do not end with ':' or '=' */ + return NULL; + + /* skip over whitespace */ + while (*p && ISSPACE(*p)) + p++; + + if (!*p) + /* no option value */ + return NULL; + + /* return pointer to option value */ + return p; +} #endif static const char *try_option(const char *p, const char *q, const char *opt) -- cgit v1.2.3