commit cf08454de6e8387f5308ea2c734255a2bd726742 Author: Tomas Hozza thozza@redhat.com Date: Fri May 17 15:01:06 2013 +0200
Include several fixies from upstream repo
- Tighten hostname checks in legal hostname() function - Replace inet_addr() with inet_pton() in src/option.c - Use dnsmasq as default DNS server for RA only if it's doing DNS - Handle IPv4 interface address labels (aliases) in Linux (#962246) - Fix failure to start with ENOTSOCK (#962874)
Signed-off-by: Tomas Hozza thozza@redhat.com
...q-2.66-Fix_failure_to_start_with_ENOTSOCK.patch | 44 +++ ...le_IPv4_interface_address_labels_in_Linux.patch | 283 ++++++++++++++++++++ ...asq-2.66-Tighten_checks_in_legal_hostname.patch | 45 +++ ...DNS-server-for-RA-only-if-it-is-doing-DNS.patch | 30 ++ ...lace-inet_addr-with-inet_pton-in-option-c.patch | 164 +++++++++++ dnsmasq.spec | 25 ++- 6 files changed, 590 insertions(+), 1 deletions(-) --- diff --git a/dnsmasq-2.66-Fix_failure_to_start_with_ENOTSOCK.patch b/dnsmasq-2.66-Fix_failure_to_start_with_ENOTSOCK.patch new file mode 100644 index 0000000..26b2795 --- /dev/null +++ b/dnsmasq-2.66-Fix_failure_to_start_with_ENOTSOCK.patch @@ -0,0 +1,44 @@ +From cfcad42ff1ddee8e64d120f18016a654152d0215 Mon Sep 17 00:00:00 2001 +From: Simon Kelley simon@thekelleys.org.uk +Date: Fri, 17 May 2013 11:32:03 +0100 +Subject: [PATCH] Fix failure to start with ENOTSOCK + +--- + CHANGELOG | 6 ++++++ + src/dnsmasq.c | 2 +- + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 7aa0024..48b6070 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -31,7 +31,13 @@ version 2.67 + want to continue to bind the aliases too, you need to add + eg. --interface=eth0:0 to the config. + ++ Fix "failed to set SO_BINDTODEVICE on DHCP socket: Socket ++ operation on non-socket" error on startup with ++ configurations which have exactly one --interface option ++ and do RA but _not_ DHCPv6. Thanks to Trever Adams for the ++ bug report. + ++ + version 2.66 + Add the ability to act as an authoritative DNS + server. Dnsmasq can now answer queries from the wider 'net +diff --git a/src/dnsmasq.c b/src/dnsmasq.c +index 43b8cb1..b0f984d 100644 +--- a/src/dnsmasq.c ++++ b/src/dnsmasq.c +@@ -248,7 +248,7 @@ int main (int argc, char **argv) + #endif + + #if defined(HAVE_LINUX_NETWORK) && defined(HAVE_DHCP6) +- if (daemon->dhcp6) ++ if (daemon->doing_dhcp6) + bindtodevice(daemon->dhcp6fd); + #endif + } +-- +1.8.1.4 + diff --git a/dnsmasq-2.66-Handle_IPv4_interface_address_labels_in_Linux.patch b/dnsmasq-2.66-Handle_IPv4_interface_address_labels_in_Linux.patch new file mode 100644 index 0000000..1434467 --- /dev/null +++ b/dnsmasq-2.66-Handle_IPv4_interface_address_labels_in_Linux.patch @@ -0,0 +1,283 @@ +From 3f2873d42c4d7e7dba32b6e64a3687d43928bc8e Mon Sep 17 00:00:00 2001 +From: Simon Kelley simon@thekelleys.org.uk +Date: Tue, 14 May 2013 11:28:47 +0100 +Subject: [PATCH] Handle IPv4 interface-address labels in Linux. + +--- + CHANGELOG | 9 +++++++++ + src/bpf.c | 2 +- + src/dhcp.c | 14 +++++++++----- + src/dnsmasq.h | 1 + + src/forward.c | 3 ++- + src/lease.c | 3 ++- + src/netlink.c | 7 +++++-- + src/network.c | 39 +++++++++++++++++++++++++++++++-------- + src/tftp.c | 3 ++- + 9 files changed, 62 insertions(+), 19 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index f6ce80e..7aa0024 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -21,6 +21,15 @@ version 2.67 + Fix --dhcp-match, --dhcp-vendorclass and --dhcp-userclass + to work with BOOTP and well as DHCP. Thanks to Peter + Korsgaard for spotting the problem. ++ ++ Handle IPv4 interface-address labels in Linux. These are ++ often used to emulate the old IP-alias addresses. Before, ++ using --interface=eth0 would service all the addresses of ++ eth0, including ones configured as aliases, which appear ++ in ifconfig as eth0:0. Now, only addresses with the label ++ eth0 are active. This is not backwards compatible: if you ++ want to continue to bind the aliases too, you need to add ++ eg. --interface=eth0:0 to the config. + + + version 2.66 +diff --git a/src/bpf.c b/src/bpf.c +index 02a3abb..e75b0c6 100644 +--- a/src/bpf.c ++++ b/src/bpf.c +@@ -123,7 +123,7 @@ int iface_enumerate(int family, void *parm, int (*callback)()) + broadcast = ((struct sockaddr_in *) addrs->ifa_broadaddr)->sin_addr; + else + broadcast.s_addr = 0; +- if (!((*callback)(addr, iface_index, netmask, broadcast, parm))) ++ if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm))) + goto err; + } + #ifdef HAVE_IPV6 +diff --git a/src/dhcp.c b/src/dhcp.c +index dd25632..333a327 100644 +--- a/src/dhcp.c ++++ b/src/dhcp.c +@@ -28,9 +28,9 @@ struct match_param { + struct in_addr netmask, broadcast, addr; + }; + +-static int complete_context(struct in_addr local, int if_index, ++static int complete_context(struct in_addr local, int if_index, char *label, + struct in_addr netmask, struct in_addr broadcast, void *vparam); +-static int check_listen_addrs(struct in_addr local, int if_index, ++static int check_listen_addrs(struct in_addr local, int if_index, char *label, + struct in_addr netmask, struct in_addr broadcast, void *vparam); + + static int make_fd(int port) +@@ -287,7 +287,7 @@ void dhcp_packet(time_t now, int pxe_fd) + iface_addr = match.addr; + /* make sure secondary address gets priority in case + there is more than one address on the interface in the same subnet */ +- complete_context(match.addr, iface_index, match.netmask, match.broadcast, &parm); ++ complete_context(match.addr, iface_index, NULL, match.netmask, match.broadcast, &parm); + } + + if (!iface_enumerate(AF_INET, &parm, complete_context)) +@@ -411,12 +411,14 @@ void dhcp_packet(time_t now, int pxe_fd) + } + + /* check against secondary interface addresses */ +-static int check_listen_addrs(struct in_addr local, int if_index, ++static int check_listen_addrs(struct in_addr local, int if_index, char *label, + struct in_addr netmask, struct in_addr broadcast, void *vparam) + { + struct match_param *param = vparam; + struct iname *tmp; + ++ (void) label; ++ + if (if_index == param->ind) + { + for (tmp = daemon->if_addrs; tmp; tmp = tmp->next) +@@ -444,11 +446,13 @@ static int check_listen_addrs(struct in_addr local, int if_index, + + Note that the current chain may be superceded later for configured hosts or those coming via gateways. */ + +-static int complete_context(struct in_addr local, int if_index, ++static int complete_context(struct in_addr local, int if_index, char *label, + struct in_addr netmask, struct in_addr broadcast, void *vparam) + { + struct dhcp_context *context; + struct iface_param *param = vparam; ++ ++ (void)label; + + for (context = daemon->dhcp; context; context = context->next) + { +diff --git a/src/dnsmasq.h b/src/dnsmasq.h +index e177cea..8866dd8 100644 +--- a/src/dnsmasq.h ++++ b/src/dnsmasq.h +@@ -1030,6 +1030,7 @@ void create_bound_listeners(int die); + int is_dad_listeners(void); + int iface_check(int family, struct all_addr *addr, char *name, int *auth_dns); + int loopback_exception(int fd, int family, struct all_addr *addr, char *name); ++int label_exception(int index, int family, struct all_addr *addr); + int fix_fd(int fd); + int tcp_interface(int fd, int af); + struct in_addr get_ifaddr(char *intr); +diff --git a/src/forward.c b/src/forward.c +index 78495ca..28fe9eb 100644 +--- a/src/forward.c ++++ b/src/forward.c +@@ -789,7 +789,8 @@ void receive_query(struct listener *listen, time_t now) + { + if (!option_bool(OPT_CLEVERBIND)) + enumerate_interfaces(); +- if (!loopback_exception(listen->fd, listen->family, &dst_addr, ifr.ifr_name)) ++ if (!loopback_exception(listen->fd, listen->family, &dst_addr, ifr.ifr_name) && ++ !label_exception(if_index, listen->family, &dst_addr)) + return; + } + +diff --git a/src/lease.c b/src/lease.c +index a4560ba..b85cf57 100644 +--- a/src/lease.c ++++ b/src/lease.c +@@ -345,11 +345,12 @@ void lease_update_file(time_t now) + } + + +-static int find_interface_v4(struct in_addr local, int if_index, ++static int find_interface_v4(struct in_addr local, int if_index, char *label, + struct in_addr netmask, struct in_addr broadcast, void *vparam) + { + struct dhcp_lease *lease; + ++ (void) label; + (void) broadcast; + (void) vparam; + +diff --git a/src/netlink.c b/src/netlink.c +index 0881b71..78d0926 100644 +--- a/src/netlink.c ++++ b/src/netlink.c +@@ -215,7 +215,8 @@ int iface_enumerate(int family, void *parm, int (*callback)()) + if (ifa->ifa_family == AF_INET) + { + struct in_addr netmask, addr, broadcast; +- ++ char *label = NULL; ++ + netmask.s_addr = htonl(0xffffffff << (32 - ifa->ifa_prefixlen)); + addr.s_addr = 0; + broadcast.s_addr = 0; +@@ -226,12 +227,14 @@ int iface_enumerate(int family, void *parm, int (*callback)()) + addr = *((struct in_addr *)(rta+1)); + else if (rta->rta_type == IFA_BROADCAST) + broadcast = *((struct in_addr *)(rta+1)); ++ else if (rta->rta_type == IFA_LABEL) ++ label = RTA_DATA(rta); + + rta = RTA_NEXT(rta, len1); + } + + if (addr.s_addr && callback_ok) +- if (!((*callback)(addr, ifa->ifa_index, netmask, broadcast, parm))) ++ if (!((*callback)(addr, ifa->ifa_index, label, netmask, broadcast, parm))) + callback_ok = 0; + } + #ifdef HAVE_IPV6 +diff --git a/src/network.c b/src/network.c +index 792914b..473e85f 100644 +--- a/src/network.c ++++ b/src/network.c +@@ -204,7 +204,27 @@ int loopback_exception(int fd, int family, struct all_addr *addr, char *name) + return 0; + } + +-static int iface_allowed(struct irec **irecp, int if_index, ++/* If we're configured with something like --interface=eth0:0 then we'll listen correctly ++ on the relevant address, but the name of the arrival interface, derived from the ++ index won't match the config. Check that we found an interface address for the arrival ++ interface: daemon->interfaces must be up-to-date. */ ++int label_exception(int index, int family, struct all_addr *addr) ++{ ++ struct irec *iface; ++ ++ /* labels only supported on IPv4 addresses. */ ++ if (family != AF_INET) ++ return 0; ++ ++ for (iface = daemon->interfaces; iface; iface = iface->next) ++ if (iface->index == index && iface->addr.sa.sa_family == AF_INET && ++ iface->addr.in.sin_addr.s_addr == addr->addr.addr4.s_addr) ++ return 1; ++ ++ return 0; ++} ++ ++static int iface_allowed(struct irec **irecp, int if_index, char *label, + union mysockaddr *addr, struct in_addr netmask, int dad) + { + struct irec *iface; +@@ -242,8 +262,8 @@ static int iface_allowed(struct irec **irecp, int if_index, + loopback = ifr.ifr_flags & IFF_LOOPBACK; + + if (loopback) +- dhcp_ok = 0; +- ++ dhcp_ok = 0; ++ + if (ioctl(fd, SIOCGIFMTU, &ifr) != -1) + mtu = ifr.ifr_mtu; + +@@ -272,13 +292,16 @@ static int iface_allowed(struct irec **irecp, int if_index, + } + } + ++ if (!label) ++ label = ifr.ifr_name; ++ + if (addr->sa.sa_family == AF_INET && +- !iface_check(AF_INET, (struct all_addr *)&addr->in.sin_addr, ifr.ifr_name, &auth_dns)) ++ !iface_check(AF_INET, (struct all_addr *)&addr->in.sin_addr, label, &auth_dns)) + return 1; + + #ifdef HAVE_IPV6 + if (addr->sa.sa_family == AF_INET6 && +- !iface_check(AF_INET6, (struct all_addr *)&addr->in6.sin6_addr, ifr.ifr_name, &auth_dns)) ++ !iface_check(AF_INET6, (struct all_addr *)&addr->in6.sin6_addr, label, &auth_dns)) + return 1; + #endif + +@@ -348,11 +371,11 @@ static int iface_allowed_v6(struct in6_addr *local, int prefix, + addr.in6.sin6_port = htons(daemon->port); + addr.in6.sin6_scope_id = if_index; + +- return iface_allowed((struct irec **)vparam, if_index, &addr, netmask, !!(flags & IFACE_TENTATIVE)); ++ return iface_allowed((struct irec **)vparam, if_index, NULL, &addr, netmask, !!(flags & IFACE_TENTATIVE)); + } + #endif + +-static int iface_allowed_v4(struct in_addr local, int if_index, ++static int iface_allowed_v4(struct in_addr local, int if_index, char *label, + struct in_addr netmask, struct in_addr broadcast, void *vparam) + { + union mysockaddr addr; +@@ -366,7 +389,7 @@ static int iface_allowed_v4(struct in_addr local, int if_index, + addr.in.sin_addr = local; + addr.in.sin_port = htons(daemon->port); + +- return iface_allowed((struct irec **)vparam, if_index, &addr, netmask, 0); ++ return iface_allowed((struct irec **)vparam, if_index, label, &addr, netmask, 0); + } + + int enumerate_interfaces(void) +diff --git a/src/tftp.c b/src/tftp.c +index 960b1ee..d7d050f 100644 +--- a/src/tftp.c ++++ b/src/tftp.c +@@ -202,7 +202,8 @@ void tftp_request(struct listener *listen, time_t now) + { + if (!option_bool(OPT_CLEVERBIND)) + enumerate_interfaces(); +- if (!loopback_exception(listen->tftpfd, listen->family, &addra, name)) ++ if (!loopback_exception(listen->tftpfd, listen->family, &addra, name) && ++ !label_exception(if_index, listen->family, &addra) ) + return; + } + +-- +1.8.1.4 + diff --git a/dnsmasq-2.66-Tighten_checks_in_legal_hostname.patch b/dnsmasq-2.66-Tighten_checks_in_legal_hostname.patch new file mode 100644 index 0000000..cc6f603 --- /dev/null +++ b/dnsmasq-2.66-Tighten_checks_in_legal_hostname.patch @@ -0,0 +1,45 @@ +From 7abb69b5dc8dbe369be36bd7bf23c039b036acd1 Mon Sep 17 00:00:00 2001 +From: Simon Kelley simon@thekelleys.org.uk +Date: Mon, 29 Apr 2013 10:52:16 +0100 +Subject: [PATCH] Tighten checks in legal_hostname(). + +--- + src/util.c | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +diff --git a/src/util.c b/src/util.c +index 848e01b..af4031c 100644 +--- a/src/util.c ++++ b/src/util.c +@@ -142,19 +142,23 @@ static int check_name(char *in) + int legal_hostname(char *name) + { + char c; ++ int first; + + if (!check_name(name)) + return 0; + +- for (; (c = *name); name++) ++ for (first = 1; (c = *name); name++, first = 0) + /* check for legal char a-z A-Z 0-9 - _ . */ + { + if ((c >= 'A' && c <= 'Z') || +- (c >= 'a' && c <= 'z') || +- (c >= '0' && c <= '9') || +- c == '-' || c == '_') ++ (c >= 'a' && c <= 'z')) + continue; +- ++ ++ if (!first && ++ ((c >= '0' && c <= '9') || ++ c == '-' || c == '_')) ++ continue; ++ + /* end of hostname part */ + if (c == '.') + return 1; +-- +1.8.1.4 + diff --git a/dnsmasq-2.66-Use-dnsmasq-as-default-DNS-server-for-RA-only-if-it-is-doing-DNS.patch b/dnsmasq-2.66-Use-dnsmasq-as-default-DNS-server-for-RA-only-if-it-is-doing-DNS.patch new file mode 100644 index 0000000..22139ee --- /dev/null +++ b/dnsmasq-2.66-Use-dnsmasq-as-default-DNS-server-for-RA-only-if-it-is-doing-DNS.patch @@ -0,0 +1,30 @@ +From ab915f837c1db9b8b095158b41028ea71246d68d Mon Sep 17 00:00:00 2001 +From: Simon Kelley simon@thekelleys.org.uk +Date: Tue, 30 Apr 2013 10:41:28 +0100 +Subject: [PATCH] Only use ourselves as default DNS server for RA if we're + doing DNS. + +This makes RA the same as DHCP4/6 +--- + src/radv.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/radv.c b/src/radv.c +index a708758..72a93cb 100644 +--- a/src/radv.c ++++ b/src/radv.c +@@ -300,9 +300,9 @@ static void send_ra(time_t now, int iface, char *iface_name, struct in6_addr *de + } + } + +- if (!done_dns) ++ if (daemon->port == NAMESERVER_PORT && !done_dns) + { +- /* default == us. */ ++ /* default == us, as long as we are supplying DNS service. */ + put_opt6_char(ICMP6_OPT_RDNSS); + put_opt6_char(3); + put_opt6_short(0); +-- +1.8.1.4 + diff --git a/dnsmasq-2.66-replace-inet_addr-with-inet_pton-in-option-c.patch b/dnsmasq-2.66-replace-inet_addr-with-inet_pton-in-option-c.patch new file mode 100644 index 0000000..d21a776 --- /dev/null +++ b/dnsmasq-2.66-replace-inet_addr-with-inet_pton-in-option-c.patch @@ -0,0 +1,164 @@ +From ddd9a6b499ae601231070854c562611a79e004c0 Mon Sep 17 00:00:00 2001 +From: Simon Kelley simon@thekelleys.org.uk +Date: Mon, 29 Apr 2013 17:00:21 +0100 +Subject: [PATCH] replace inet_addr with inet_pton() in src/option.c + +--- + src/option.c | 52 ++++++++++++++++++++++++++-------------------------- + 1 file changed, 26 insertions(+), 26 deletions(-) + +diff --git a/src/option.c b/src/option.c +index 20a8668..d2ab689 100644 +--- a/src/option.c ++++ b/src/option.c +@@ -660,7 +660,7 @@ char *parse_server(char *arg, union mysockaddr *addr, union mysockaddr *source_a + scope_id = split_chr(arg, '%'); + #endif + +- if ((addr->in.sin_addr.s_addr = inet_addr(arg)) != (in_addr_t) -1) ++ if (inet_pton(AF_INET, arg, &addr->in.sin_addr) > 0) + { + addr->in.sin_port = htons(serv_port); + addr->sa.sa_family = source_addr->sa.sa_family = AF_INET; +@@ -675,7 +675,7 @@ char *parse_server(char *arg, union mysockaddr *addr, union mysockaddr *source_a + if (flags) + *flags |= SERV_HAS_SOURCE; + source_addr->in.sin_port = htons(source_port); +- if ((source_addr->in.sin_addr.s_addr = inet_addr(source)) == (in_addr_t) -1) ++ if (!(inet_pton(AF_INET, source, &source_addr->in.sin_addr) > 0)) + { + #if defined(SO_BINDTODEVICE) + source_addr->in.sin_addr.s_addr = INADDR_ANY; +@@ -1031,7 +1031,7 @@ static int parse_dhcp_opt(char *errstr, char *arg, int flags) + cp = comma; + comma = split(cp); + slash = split_chr(cp, '/'); +- in.s_addr = inet_addr(cp); ++ inet_pton(AF_INET, cp, &in); + if (!slash) + { + memcpy(op, &in, INADDRSZ); +@@ -1576,7 +1576,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + comma = split(arg); + new->name = NULL; + unhide_metas(arg); +- if ((new->addr.in.sin_addr.s_addr = inet_addr(arg)) != (in_addr_t)-1) ++ if (inet_pton(AF_INET, arg, &new->addr.in.sin_addr) > 0) + new->addr.sa.sa_family = AF_INET; + #ifdef HAVE_IPV6 + else if (inet_pton(AF_INET6, arg, &new->addr.in6.sin6_addr) > 0) +@@ -1927,7 +1927,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + { + struct in_addr addr; + unhide_metas(arg); +- if (arg && (addr.s_addr = inet_addr(arg)) != (in_addr_t)-1) ++ if (arg && (inet_pton(AF_INET, arg, &addr) > 0)) + { + struct bogus_addr *baddr = opt_malloc(sizeof(struct bogus_addr)); + baddr->next = daemon->bogus_addr; +@@ -1945,7 +1945,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + struct iname *new = opt_malloc(sizeof(struct iname)); + comma = split(arg); + unhide_metas(arg); +- if (arg && (new->addr.in.sin_addr.s_addr = inet_addr(arg)) != (in_addr_t)-1) ++ if (arg && (inet_pton(AF_INET, arg, &new->addr.in.sin_addr) > 0)) + { + new->addr.sa.sa_family = AF_INET; + new->addr.in.sin_port = 0; +@@ -2369,7 +2369,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + } + + if (k >= 3 && strchr(a[2], '.') && +- ((new->netmask.s_addr = inet_addr(a[2])) != (in_addr_t)-1)) ++ (inet_pton(AF_INET, a[2], &new->netmask) > 0)) + { + new->flags |= CONTEXT_NETMASK; + leasepos = 3; +@@ -2378,7 +2378,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + } + + if (k >= 4 && strchr(a[3], '.') && +- ((new->broadcast.s_addr = inet_addr(a[3])) != (in_addr_t)-1)) ++ (inet_pton(AF_INET, a[3], &new->broadcast) > 0)) + { + new->flags |= CONTEXT_BRDCAST; + leasepos = 4; +@@ -2608,7 +2608,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + } + } + } +- else if (strchr(a[j], '.') && (in.s_addr = inet_addr(a[j])) != (in_addr_t)-1) ++ else if (strchr(a[j], '.') && (inet_pton(AF_INET, a[j], &in) > 0)) + { + struct dhcp_config *configs; + +@@ -2805,17 +2805,17 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + if (comma) + { + unhide_metas(comma); +- if ((dhcp_next_server.s_addr = inet_addr(comma)) == (in_addr_t)-1) { +- +- /* +- * The user may have specified the tftp hostname here. +- * save it so that it can be resolved/looked up during +- * actual dhcp_reply(). +- */ +- +- tftp_sname = opt_string_alloc(comma); +- dhcp_next_server.s_addr = 0; +- } ++ if (!(inet_pton(AF_INET, comma, &dhcp_next_server) > 0)) ++ { ++ /* ++ * The user may have specified the tftp hostname here. ++ * save it so that it can be resolved/looked up during ++ * actual dhcp_reply(). ++ */ ++ ++ tftp_sname = opt_string_alloc(comma); ++ dhcp_next_server.s_addr = 0; ++ } + } + } + +@@ -2828,7 +2828,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + new->next = daemon->boot_config; + daemon->boot_config = new; + } +- ++ + break; + } + +@@ -3144,7 +3144,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + while (arg) { + struct addr_list *new = opt_malloc(sizeof(struct addr_list)); + comma = split(arg); +- if ((new->addr.s_addr = inet_addr(arg)) == (in_addr_t)-1) ++ if (!(inet_pton(AF_INET, arg, &new->addr) > 0)) + ret_err(_("bad dhcp-proxy address")); + new->next = daemon->override_relays; + daemon->override_relays = new; +@@ -3187,15 +3187,15 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + dash = split_chr(a[0], '-'); + + if ((k < 2) || +- ((new->in.s_addr = inet_addr(a[0])) == (in_addr_t)-1) || +- ((new->out.s_addr = inet_addr(a[1])) == (in_addr_t)-1)) ++ (!(inet_pton(AF_INET, a[0], &new->in) > 0)) || ++ (!(inet_pton(AF_INET, a[1], &new->out) > 0))) + option = '?'; + + if (k == 3) +- new->mask.s_addr = inet_addr(a[2]); ++ inet_pton(AF_INET, a[2], &new->mask); + + if (dash && +- ((new->end.s_addr = inet_addr(dash)) == (in_addr_t)-1 || ++ (!(inet_pton(AF_INET, dash, &new->end) > 0) || + !is_same_net(new->in, new->end, new->mask) || + ntohl(new->in.s_addr) > ntohl(new->end.s_addr))) + ret_err(_("invalid alias range")); +-- +1.8.1.4 + diff --git a/dnsmasq.spec b/dnsmasq.spec index f5f41cc..91af9a6 100644 --- a/dnsmasq.spec +++ b/dnsmasq.spec @@ -11,7 +11,7 @@
Name: dnsmasq Version: 2.66 -Release: 5%{?extraversion}%{?dist} +Release: 6%{?extraversion}%{?dist} Summary: A lightweight DHCP/caching DNS server
Group: System Environment/Daemons @@ -37,6 +37,16 @@ Patch5: %{name}-2.66-Manpage-typos.patch Patch6: %{name}-2.66-Note-that-dhcp_lease_time-and-dhcp_release-work-for-IPv4.patch # commit 86e92f998379d219e10517dfa2c42f544ba164ce Patch7: %{name}-2.66-dhcp-match-now-work-with-BOOTP.patch +# commit 7abb69b5dc8dbe369be36bd7bf23c039b036acd1 +Patch8: %{name}-2.66-Tighten_checks_in_legal_hostname.patch +# commit ddd9a6b499ae601231070854c562611a79e004c0 +Patch9: %{name}-2.66-replace-inet_addr-with-inet_pton-in-option-c.patch +# commit b915f837c1db9b8b095158b41028ea71246d68d +Patch10: %{name}-2.66-Use-dnsmasq-as-default-DNS-server-for-RA-only-if-it-is-doing-DNS.patch +# commit 3f2873d42c4d7e7dba32b6e64a3687d43928bc8e - Bug #962246 +Patch11: %{name}-2.66-Handle_IPv4_interface_address_labels_in_Linux.patch +# commit cfcad42ff1ddee8e64d120f18016a654152d0215 - Bug #962874 +Patch12: %{name}-2.66-Fix_failure_to_start_with_ENOTSOCK.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -80,6 +90,11 @@ query/remove a DHCP server's leases. %patch5 -p1 %patch6 -p1 -b .utils_work_only_ipv4 %patch7 -p1 -b .dhcp-match_bootp +%patch8 -p1 -b .hosname_checks +%patch9 -p1 -b .inet_pton +%patch10 -p1 -b .default_dns_server +%patch11 -p1 -b .interface_aliases +%patch12 -p1 -b .enotsock_failure
# use /var/lib/dnsmasq instead of /var/lib/misc for file in dnsmasq.conf.example man/dnsmasq.8 man/es/dnsmasq.8 src/config.h; do @@ -164,6 +179,14 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man1/dhcp_*
%changelog +* Fri May 17 2013 Tomas Hozza thozza@redhat.com - 2.66-6 +- include several fixies from upstream repo: + - Tighten hostname checks in legal hostname() function + - Replace inet_addr() with inet_pton() in src/option.c + - Use dnsmasq as default DNS server for RA only if it's doing DNS + - Handle IPv4 interface address labels (aliases) in Linux (#962246) + - Fix failure to start with ENOTSOCK (#962874) + * Tue Apr 30 2013 Tomas Hozza thozza@redhat.com - 2.66-5 - dnsmasq unit file cleanup - drop forking Type and PIDfile and rather start dnsmasq with "-k" option
scm-commits@lists.fedoraproject.org