diff --git a/CMakeLists.txt b/CMakeLists.txt index a8e731d06..95b08c709 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,6 @@ cmake_minimum_required(VERSION 2.8.12) project(PIHOLE_FTL C) -set(DNSMASQ_VERSION pi-hole-v2.88rc1) +set(DNSMASQ_VERSION pi-hole-v2.88rc3) add_subdirectory(src) diff --git a/src/dnsmasq/dbus.c b/src/dnsmasq/dbus.c index ef807111b..fd5d1ca6b 100644 --- a/src/dnsmasq/dbus.c +++ b/src/dnsmasq/dbus.c @@ -461,8 +461,8 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings) } while (dbus_message_iter_get_arg_type(&string_iter) == DBUS_TYPE_STRING); } - if (sdetails.resolved) - freeaddrinfo(sdetails.hostinfo); + if (sdetails.orig_hostinfo) + freeaddrinfo(sdetails.orig_hostinfo); /* jump to next element in outer array */ dbus_message_iter_next(&array_iter); diff --git a/src/dnsmasq/dnsmasq.h b/src/dnsmasq/dnsmasq.h index c27b93f10..f91729cbe 100644 --- a/src/dnsmasq/dnsmasq.h +++ b/src/dnsmasq/dnsmasq.h @@ -1300,9 +1300,9 @@ extern struct daemon { struct server_details { union mysockaddr *addr, *source_addr; - struct addrinfo *hostinfo; + struct addrinfo *hostinfo, *orig_hostinfo; char *interface, *source, *scope_id, *interface_opt; - int serv_port, source_port, addr_type, scope_index, valid, resolved; + int serv_port, source_port, addr_type, scope_index, valid; u16 *flags; }; diff --git a/src/dnsmasq/option.c b/src/dnsmasq/option.c index b511ef34d..0ad660fdc 100644 --- a/src/dnsmasq/option.c +++ b/src/dnsmasq/option.c @@ -864,11 +864,13 @@ char *parse_server(char *arg, struct server_details *sdetails) sdetails->serv_port = NAMESERVER_PORT; char *portno; int ecode = 0; - struct addrinfo hints = { 0 }; + struct addrinfo hints; + memset(&hints, 0, sizeof(struct addrinfo)); + *sdetails->interface = 0; sdetails->addr_type = AF_UNSPEC; - + if (strcmp(arg, "#") == 0) { if (sdetails->flags) @@ -947,7 +949,7 @@ char *parse_server(char *arg, struct server_details *sdetails) above, and returns a pointer to the start of the list in . The items in the linked list are linked by the field. */ sdetails->valid = 1; - sdetails->resolved = 1; + sdetails->orig_hostinfo = sdetails->hostinfo; return NULL; } else @@ -971,7 +973,7 @@ char *parse_server_addr(struct server_details *sdetails) sdetails->addr->in.sin_port = htons(sdetails->serv_port); sdetails->addr->sa.sa_family = sdetails->source_addr->sa.sa_family = AF_INET; #ifdef HAVE_SOCKADDR_SA_LEN - source_addr->in.sin_len = addr->in.sin_len = sizeof(struct sockaddr_in); + sdetails->source_addr->in.sin_len = sdetails->addr->in.sin_len = sizeof(struct sockaddr_in); #endif sdetails->source_addr->in.sin_addr.s_addr = INADDR_ANY; sdetails->source_addr->in.sin_port = htons(daemon->query_port); @@ -989,7 +991,7 @@ char *parse_server_addr(struct server_details *sdetails) /* When resolving a server IP by hostname, we can simply skip mismatching server / source IP pairs. Otherwise, when an IP address is given directly, this is a fatal error. */ - if (!sdetails->resolved) + if (!sdetails->orig_hostinfo) return _("cannot use IPv4 server address with IPv6 source address"); } else @@ -1020,7 +1022,7 @@ char *parse_server_addr(struct server_details *sdetails) sdetails->addr->sa.sa_family = sdetails->source_addr->sa.sa_family = AF_INET6; sdetails->addr->in6.sin6_flowinfo = sdetails->source_addr->in6.sin6_flowinfo = 0; #ifdef HAVE_SOCKADDR_SA_LEN - sdetails->addr->in6.sin6_len = sdetails->source_addr->in6.sin6_len = sizeof(addr->in6); + sdetails->addr->in6.sin6_len = sdetails->source_addr->in6.sin6_len = sizeof(sdetails->addr->in6); #endif if (sdetails->source) { @@ -1035,7 +1037,7 @@ char *parse_server_addr(struct server_details *sdetails) /* When resolving a server IP by hostname, we can simply skip mismatching server / source IP pairs. Otherwise, when an IP address is given directly, this is a fatal error. */ - if(!sdetails->resolved) + if(!sdetails->orig_hostinfo) return _("cannot use IPv6 server address with IPv4 source address"); } else @@ -1102,12 +1104,14 @@ static char *domain_rev4(int from_file, char *server, struct in_addr *addr4, int union mysockaddr serv_addr, source_addr; char interface[IF_NAMESIZE+1]; int count = 1, rem, addrbytes, addrbits; - struct server_details sdetails = { 0 }; + struct server_details sdetails; + + memset(&sdetails, 0, sizeof(struct server_details)); sdetails.addr = &serv_addr; sdetails.source_addr = &source_addr; sdetails.interface = interface; sdetails.flags = &flags; - + if (!server) flags = SERV_LITERAL_ADDRESS; else if ((string = parse_server(server, &sdetails))) @@ -1165,8 +1169,8 @@ static char *domain_rev4(int from_file, char *server, struct in_addr *addr4, int return _("error"); } - if (sdetails.resolved) - freeaddrinfo(sdetails.hostinfo); + if (sdetails.orig_hostinfo) + freeaddrinfo(sdetails.orig_hostinfo); } } @@ -1183,12 +1187,14 @@ static char *domain_rev6(int from_file, char *server, struct in6_addr *addr6, in union mysockaddr serv_addr, source_addr; char interface[IF_NAMESIZE+1]; int count = 1, rem, addrbytes, addrbits; - struct server_details sdetails = { 0 }; + struct server_details sdetails; + + memset(&sdetails, 0, sizeof(struct server_details)); sdetails.addr = &serv_addr; sdetails.source_addr = &source_addr; sdetails.interface = interface; sdetails.flags = &flags; - + if (!server) flags = SERV_LITERAL_ADDRESS; else if ((string = parse_server(server, &sdetails))) @@ -1248,8 +1254,8 @@ static char *domain_rev6(int from_file, char *server, struct in6_addr *addr6, in return _("error"); } - if (sdetails.resolved) - freeaddrinfo(sdetails.hostinfo); + if (sdetails.orig_hostinfo) + freeaddrinfo(sdetails.orig_hostinfo); } } @@ -2969,13 +2975,14 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma union all_addr addr; union mysockaddr serv_addr, source_addr; char interface[IF_NAMESIZE+1]; + struct server_details sdetails; - struct server_details sdetails = { 0 }; + memset(&sdetails, 0, sizeof(struct server_details)); sdetails.addr = &serv_addr; sdetails.source_addr = &source_addr; sdetails.interface = interface; sdetails.flags = &flags; - + unhide_metas(arg); /* split the domain args, if any and skip to the end of them. */ @@ -3055,8 +3062,8 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma break; } - if (sdetails.resolved) - freeaddrinfo(sdetails.hostinfo); + if (sdetails.orig_hostinfo) + freeaddrinfo(sdetails.orig_hostinfo); break; }