From 0fdf3c1f61eb3ea2970bb99930e81f7af2534c88 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Fri, 5 Oct 2018 23:35:54 +0100 Subject: [PATCH] Fix dhcp-match-name to match hostname, not complete FQDN. Also do name matching for DHCPv6. --- src/rfc2131.c | 64 +++++++++++++++++++++++++-------------------------- src/rfc3315.c | 29 +++++++++++++++++++++++ 2 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/rfc2131.c b/src/rfc2131.c index 64e8167..56dc3d1 100644 --- a/src/rfc2131.c +++ b/src/rfc2131.c @@ -700,39 +700,9 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, client_hostname = daemon->dhcp_buff; } - if (client_hostname) - { - struct dhcp_match_name *m; - size_t nl = strlen(client_hostname); - - if (option_bool(OPT_LOG_OPTS)) - my_syslog(MS_DHCP | LOG_INFO, _("%u client provides name: %s"), ntohl(mess->xid), client_hostname); + if (client_hostname && option_bool(OPT_LOG_OPTS)) + my_syslog(MS_DHCP | LOG_INFO, _("%u client provides name: %s"), ntohl(mess->xid), client_hostname); - - for (m = daemon->dhcp_name_match; m; m = m->next) - { - size_t ml = strlen(m->name); - char save = 0; - - if (nl < ml) - continue; - if (nl > ml) - { - save = client_hostname[ml]; - client_hostname[ml] = 0; - } - - if (hostname_isequal(client_hostname, m->name) && - (save == 0 || m->wildcard)) - { - m->netid->next = netid; - netid = m->netid; - } - - if (save != 0) - client_hostname[ml] = save; - } - } if (have_config(config, CONFIG_NAME)) { @@ -745,11 +715,15 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, } else if (client_hostname) { + struct dhcp_match_name *m; + size_t nl; + domain = strip_hostname(client_hostname); - if (strlen(client_hostname) != 0) + if ((nl = strlen(client_hostname)) != 0) { hostname = client_hostname; + if (!config) { /* Search again now we have a hostname. @@ -767,6 +741,30 @@ size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index, netid = &known_id; } } + + for (m = daemon->dhcp_name_match; m; m = m->next) + { + size_t ml = strlen(m->name); + char save = 0; + + if (nl < ml) + continue; + if (nl > ml) + { + save = client_hostname[ml]; + client_hostname[ml] = 0; + } + + if (hostname_isequal(client_hostname, m->name) && + (save == 0 || m->wildcard)) + { + m->netid->next = netid; + netid = m->netid; + } + + if (save != 0) + client_hostname[ml] = save; + } } } diff --git a/src/rfc3315.c b/src/rfc3315.c index bca3268..a20776d 100644 --- a/src/rfc3315.c +++ b/src/rfc3315.c @@ -496,11 +496,16 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_ } else if (state->client_hostname) { + struct dhcp_match_name *m; + size_t nl; + state->domain = strip_hostname(state->client_hostname); + nl = strlen(state->client_hostname); if (strlen(state->client_hostname) != 0) { state->hostname = state->client_hostname; + if (!config) { /* Search again now we have a hostname. @@ -510,6 +515,30 @@ static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_ if (new && !have_config(new, CONFIG_CLID) && !new->hwaddr) config = new; } + + for (m = daemon->dhcp_name_match; m; m = m->next) + { + size_t ml = strlen(m->name); + char save = 0; + + if (nl < ml) + continue; + if (nl > ml) + { + save = state->client_hostname[ml]; + state->client_hostname[ml] = 0; + } + + if (hostname_isequal(state->client_hostname, m->name) && + (save == 0 || m->wildcard)) + { + m->netid->next = state->tags; + state->tags = m->netid; + } + + if (save != 0) + state->client_hostname[ml] = save; + } } } }