diff --git a/NEWS b/NEWS index 311f5ac0a3d3f35cac8b43cebff0bc908acbfd44..1a02ea18fe20c1e77071660215bfaca8e8a6cba6 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ Bugfixes - policy.FORWARD and STUB: use RTT tracking to choose servers (#125, #208) - dns64: fix CNAME problems (#203) It still won't work with query policies. - hints: better interpretation of hosts-like files (#204) + also, error out if a bad entry is encountered in the file Improvements ------------ diff --git a/modules/hints/hints.c b/modules/hints/hints.c index c061af16f01e86a09cf77167a0e002bfb77a2af8..c1aa9252d8e8b9107381749ebebf9d4734d30e8e 100644 --- a/modules/hints/hints.c +++ b/modules/hints/hints.c @@ -342,6 +342,7 @@ static int load_file(struct kr_module *module, const char *path) size_t count = 0; size_t line_count = 0; auto_free char *line = NULL; + int ret = kr_ok(); while (getline(&line, &line_len, fp) > 0) { ++line_count; @@ -352,26 +353,40 @@ static int load_file(struct kr_module *module, const char *path) } const char *canonical_name = strtok_r(NULL, " \t\n", &saveptr); if (canonical_name == NULL) { - ERR_MSG("%s:%zu: invalid syntax\n", path, line_count); - continue; + ret = -1; + goto error; } /* Since the last added PTR records takes preference, * we add canonical name as the last one. */ const char *name_tok; while ((name_tok = strtok_r(NULL, " \t\n", &saveptr)) != NULL) { - if (add_pair(&data->hints, name_tok, addr) == 0) { - count += 1; + ret = add_pair(&data->hints, name_tok, addr); + if (!ret) { + ret = add_reverse_pair(&data->reverse_hints, name_tok, addr); + } + if (ret) { + ret = -1; + goto error; } - add_reverse_pair(&data->reverse_hints, name_tok, addr); - } - if (add_pair(&data->hints, canonical_name, addr) == 0) { count += 1; } - add_reverse_pair(&data->reverse_hints, canonical_name, addr); + ret = add_pair(&data->hints, canonical_name, addr); + if (!ret) { + ret = add_reverse_pair(&data->reverse_hints, canonical_name, addr); + } + if (ret) { + ret = -1; + goto error; + } + count += 1; + } +error: + if (ret) { + ret = kr_error(ret); + ERR_MSG("%s:%zu: invalid syntax\n", path, line_count); } - VERBOSE_MSG(NULL, "loaded %zu hints\n", count); - return kr_ok(); + return ret; } static char* hint_add_hosts(void *env, struct kr_module *module, const char *args)