diff options
author | Francis Dupont <fdupont@isc.org> | 2019-11-13 14:15:21 +0100 |
---|---|---|
committer | Francis Dupont <fdupont@isc.org> | 2019-11-13 14:15:21 +0100 |
commit | 2bf9c0e7f0594687be090478ddcdb4fe6f7cd377 (patch) | |
tree | 0f8cf1a874d3eb9a5b8d768c9bb49549e9d863ab /common/parse.c | |
parent | f78a41b766d7fe99e82775e5852b649f97639c36 (diff) | |
download | isc-dhcp-2bf9c0e7f0594687be090478ddcdb4fe6f7cd377.tar.gz |
Ported domain name fix2-domain-name-appears-to-be-wrongly-encoded-v4-1-esv
Diffstat (limited to 'common/parse.c')
-rw-r--r-- | common/parse.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/common/parse.c b/common/parse.c index ff31e28c..eabf3ed2 100644 --- a/common/parse.c +++ b/common/parse.c @@ -5266,15 +5266,13 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) break; case 'd': /* Domain name... */ - val = parse_host_name (cfile); - if (!val) { - parse_warn (cfile, "not a valid domain name."); - skip_to_semi (cfile); + t = parse_domain_name(cfile); + if (!t) { + parse_warn(cfile, "not a valid domain name."); + skip_to_semi(cfile); return 0; } - len = strlen (val); - freeval = ISC_TRUE; - goto make_string; + break; case 't': /* Text string... */ token = next_token (&val, &len, cfile); @@ -5286,7 +5284,6 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } return 0; } - make_string: if (!make_const_data (&t, (const unsigned char *)val, len, 1, 1, MDL)) log_fatal ("No memory for concatenation"); @@ -5938,3 +5935,42 @@ parse_domain_list(struct parse *cfile, int compress) return t; } +struct expression * +parse_domain_name(struct parse *cfile) +{ + const char *val; + struct expression *t = NULL; + unsigned len; + int result; + unsigned char buf[NS_MAXCDNAME]; + + val = parse_host_name(cfile); + if (!val) { + return NULL; + } + result = MRns_name_pton(val, buf, sizeof(buf)); + /* No longer need val */ + dfree((char *)val, MDL); + + /* result == 1 means the input was fully qualified. + * result == 0 means the input wasn't. + * result == -1 means bad things. + */ + if (result < 0) { + parse_warn(cfile, "Error assembling domain name: %m"); + return NULL; + } + + /* Compute the used length */ + len = 0; + while (buf[len] != 0) { + len += buf[len] + 1; + } + /* Count the last label (0). */ + len++; + + if (!make_const_data(&t, buf, len, 1, 1, MDL)) + log_fatal("No memory for domain name object."); + + return t; +} |