--- embedaddon/dnsmasq/src/rfc2131.c 2021/03/17 00:56:46 1.1.1.4 +++ embedaddon/dnsmasq/src/rfc2131.c 2023/09/27 11:02:07 1.1.1.5 @@ -1,4 +1,4 @@ -/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley +/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -372,9 +372,22 @@ size_t dhcp_reply(struct dhcp_context *context, char * if (!context) { - my_syslog(MS_DHCP | LOG_WARNING, _("no address range available for DHCP request %s %s"), - subnet_addr.s_addr ? _("with subnet selector") : _("via"), - subnet_addr.s_addr ? inet_ntoa(subnet_addr) : (mess->giaddr.s_addr ? inet_ntoa(mess->giaddr) : iface_name)); + const char *via; + if (subnet_addr.s_addr) + { + via = _("with subnet selector"); + inet_ntop(AF_INET, &subnet_addr, daemon->addrbuff, ADDRSTRLEN); + } + else + { + via = _("via"); + if (mess->giaddr.s_addr) + inet_ntop(AF_INET, &mess->giaddr, daemon->addrbuff, ADDRSTRLEN); + else + safe_strncpy(daemon->addrbuff, iface_name, ADDRSTRLEN); + } + my_syslog(MS_DHCP | LOG_WARNING, _("no address range available for DHCP request %s %s"), + via, daemon->addrbuff); return 0; } @@ -383,13 +396,19 @@ size_t dhcp_reply(struct dhcp_context *context, char * struct dhcp_context *context_tmp; for (context_tmp = context; context_tmp; context_tmp = context_tmp->current) { - strcpy(daemon->namebuff, inet_ntoa(context_tmp->start)); + inet_ntop(AF_INET, &context_tmp->start, daemon->namebuff, MAXDNAME); if (context_tmp->flags & (CONTEXT_STATIC | CONTEXT_PROXY)) - my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP subnet: %s/%s"), - ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->netmask)); + { + inet_ntop(AF_INET, &context_tmp->netmask, daemon->addrbuff, ADDRSTRLEN); + my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP subnet: %s/%s"), + ntohl(mess->xid), daemon->namebuff, daemon->addrbuff); + } else - my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP range: %s -- %s"), - ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->end)); + { + inet_ntop(AF_INET, &context_tmp->end, daemon->addrbuff, ADDRSTRLEN); + my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP range: %s -- %s"), + ntohl(mess->xid), daemon->namebuff, daemon->addrbuff); + } } } @@ -1031,8 +1050,9 @@ size_t dhcp_reply(struct dhcp_context *context, char * config->addr.s_addr == option_addr(opt).s_addr) { prettyprint_time(daemon->dhcp_buff, DECLINE_BACKOFF); + inet_ntop(AF_INET, &config->addr, daemon->addrbuff, ADDRSTRLEN); my_syslog(MS_DHCP | LOG_WARNING, _("disabling DHCP static address %s for %s"), - inet_ntoa(config->addr), daemon->dhcp_buff); + daemon->addrbuff, daemon->dhcp_buff); config->flags |= CONFIG_DECLINED; config->decline_time = now; } @@ -1078,7 +1098,7 @@ size_t dhcp_reply(struct dhcp_context *context, char * if (have_config(config, CONFIG_ADDR)) { - char *addrs = inet_ntoa(config->addr); + inet_ntop(AF_INET, &config->addr, daemon->addrbuff, ADDRSTRLEN); if ((ltmp = lease_find_by_addr(config->addr)) && ltmp != lease && @@ -1088,7 +1108,7 @@ size_t dhcp_reply(struct dhcp_context *context, char * unsigned char *mac = extended_hwaddr(ltmp->hwaddr_type, ltmp->hwaddr_len, ltmp->hwaddr, ltmp->clid_len, ltmp->clid, &len); my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"), - addrs, print_mac(daemon->namebuff, mac, len)); + daemon->addrbuff, print_mac(daemon->namebuff, mac, len)); } else { @@ -1097,10 +1117,10 @@ size_t dhcp_reply(struct dhcp_context *context, char * if (context->router.s_addr == config->addr.s_addr) break; if (tmp) - my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is in use by the server or relay"), addrs); + my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is in use by the server or relay"), daemon->addrbuff); else if (have_config(config, CONFIG_DECLINED) && difftime(now, config->decline_time) < (float)DECLINE_BACKOFF) - my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"), addrs); + my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"), daemon->addrbuff); else conf = config->addr; } @@ -1133,15 +1153,22 @@ size_t dhcp_reply(struct dhcp_context *context, char * tagif_netid = run_tag_if(&context->netid); } - log_tags(tagif_netid, ntohl(mess->xid)); apply_delay(mess->xid, recvtime, tagif_netid); if (option_bool(OPT_RAPID_COMMIT) && option_find(mess, sz, OPTION_RAPID_COMMIT, 0)) { rapid_commit = 1; + /* If a lease exists for this host and another address, squash it. */ + if (lease && lease->addr.s_addr != mess->yiaddr.s_addr) + { + lease_prune(lease, now); + lease = NULL; + } goto rapid_commit; } + log_tags(tagif_netid, ntohl(mess->xid)); + daemon->metrics[METRIC_DHCPOFFER]++; log_packet("DHCPOFFER" , &mess->yiaddr, emac, emac_len, iface_name, NULL, NULL, mess->xid); @@ -1303,9 +1330,10 @@ size_t dhcp_reply(struct dhcp_context *context, char * a lease from one of it's MACs to give the address to another. */ if (config && config_has_mac(config, ltmp->hwaddr, ltmp->hwaddr_len, ltmp->hwaddr_type)) { + inet_ntop(AF_INET, <mp->addr, daemon->addrbuff, ADDRSTRLEN); my_syslog(MS_DHCP | LOG_INFO, _("abandoning lease to %s of %s"), print_mac(daemon->namebuff, ltmp->hwaddr, ltmp->hwaddr_len), - inet_ntoa(ltmp->addr)); + daemon->addrbuff); lease = ltmp; } else @@ -1399,21 +1427,18 @@ size_t dhcp_reply(struct dhcp_context *context, char * /* DNSMASQ_REQUESTED_OPTIONS */ if ((opt = option_find(mess, sz, OPTION_REQUESTED_OPTIONS, 1))) { - int len = option_len(opt); + int i, len = option_len(opt); unsigned char *rop = option_ptr(opt, 0); - char *q = daemon->namebuff; - int i; + for (i = 0; i < len; i++) - { - q += snprintf(q, MAXDNAME - (q - daemon->namebuff), "%d%s", rop[i], i + 1 == len ? "" : ","); - } - lease_add_extradata(lease, (unsigned char *)daemon->namebuff, (q - daemon->namebuff), 0); + lease_add_extradata(lease, (unsigned char *)daemon->namebuff, + sprintf(daemon->namebuff, "%u", rop[i]), (i + 1) == len ? 0 : ','); } else - { - add_extradata_opt(lease, NULL); - } - + lease_add_extradata(lease, NULL, 0, 0); + + add_extradata_opt(lease, option_find(mess, sz, OPTION_MUD_URL_V4, 1)); + /* space-concat tag set */ if (!tagif_netid) add_extradata_opt(lease, NULL); @@ -1653,7 +1678,7 @@ static int sanitise(unsigned char *opt, char *buf) for (i = option_len(opt); i > 0; i--) { char c = *p++; - if (isprint((int)c)) + if (isprint((unsigned char)c)) *buf++ = c; } *buf = 0; /* add terminator */ @@ -1674,42 +1699,40 @@ static void add_extradata_opt(struct dhcp_lease *lease static void log_packet(char *type, void *addr, unsigned char *ext_mac, int mac_len, char *interface, char *string, char *err, u32 xid) { - struct in_addr a; - if (!err && !option_bool(OPT_LOG_OPTS) && option_bool(OPT_QUIET_DHCP)) return; - /* addr may be misaligned */ + daemon->addrbuff[0] = 0; if (addr) - memcpy(&a, addr, sizeof(a)); + inet_ntop(AF_INET, addr, daemon->addrbuff, ADDRSTRLEN); print_mac(daemon->namebuff, ext_mac, mac_len); - if(option_bool(OPT_LOG_OPTS)) - my_syslog(MS_DHCP | LOG_INFO, "%u %s(%s) %s%s%s %s%s", - ntohl(xid), - type, - interface, - addr ? inet_ntoa(a) : "", - addr ? " " : "", - daemon->namebuff, - string ? string : "", - err ? err : ""); + if (option_bool(OPT_LOG_OPTS)) + my_syslog(MS_DHCP | LOG_INFO, "%u %s(%s) %s%s%s %s%s", + ntohl(xid), + type, + interface, + daemon->addrbuff, + addr ? " " : "", + daemon->namebuff, + string ? string : "", + err ? err : ""); else my_syslog(MS_DHCP | LOG_INFO, "%s(%s) %s%s%s %s%s", type, interface, - addr ? inet_ntoa(a) : "", + daemon->addrbuff, addr ? " " : "", daemon->namebuff, string ? string : "", err ? err : ""); - + #ifdef HAVE_UBUS - if (!strcmp(type, "DHCPACK")) - ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface); - else if (!strcmp(type, "DHCPRELEASE")) - ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface); + if (!strcmp(type, "DHCPACK")) + ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? daemon->addrbuff : NULL, string, interface); + else if (!strcmp(type, "DHCPRELEASE")) + ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? daemon->addrbuff : NULL, string, interface); #endif } @@ -1861,7 +1884,10 @@ static size_t dhcp_packet_size(struct dhcp_packet *mes if (option_bool(OPT_LOG_OPTS)) { if (mess->siaddr.s_addr != 0) - my_syslog(MS_DHCP | LOG_INFO, _("%u next server: %s"), ntohl(mess->xid), inet_ntoa(mess->siaddr)); + { + inet_ntop(AF_INET, &mess->siaddr, daemon->addrbuff, ADDRSTRLEN); + my_syslog(MS_DHCP | LOG_INFO, _("%u next server: %s"), ntohl(mess->xid), daemon->addrbuff); + } if ((mess->flags & htons(0x8000)) && mess->ciaddr.s_addr == 0) my_syslog(MS_DHCP | LOG_INFO, _("%u broadcast response"), ntohl(mess->xid)); @@ -2178,8 +2204,9 @@ static int pxe_uefi_workaround(int pxe_arch, struct dh inet_ntop(AF_INET, &mess->siaddr, (char *)mess->sname, INET_ADDRSTRLEN); } - snprintf((char *)mess->file, sizeof(mess->file), - strchr(found->basename, '.') ? "%s" : "%s.0", found->basename); + if (found->basename) + snprintf((char *)mess->file, sizeof(mess->file), + strchr(found->basename, '.') ? "%s" : "%s.0", found->basename); return 1; } @@ -2785,11 +2812,4 @@ static void apply_delay(u32 xid, time_t recvtime, stru } } -#endif - - - - - - - +#endif /* HAVE_DHCP */