import of dnsmasq-2.29.tar.gz

This commit is contained in:
Simon Kelley
2006-04-22 15:05:01 +01:00
parent 5e9e0efb01
commit 309331f52c
22 changed files with 708 additions and 677 deletions

View File

@@ -141,7 +141,7 @@ void send_via_bpf(struct daemon *daemon, struct dhcp_packet *mess, size_t len,
int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), int (*ipv6_callback)())
{
char *ptr;
struct ifreq *ifr, ifaux;
struct ifreq *ifr;
struct ifconf ifc;
int fd, errsav, ret = 0;
int lastlen = 0;
@@ -186,14 +186,10 @@ int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), i
ifr = ifreq.iov_base;
memcpy(ifr, ptr, len);
strncpy(ifaux.ifr_name, ifr->ifr_name, IF_NAMESIZE);
if (ifr->ifr_addr.sa_family == AF_INET && ipv4_callback)
{
struct in_addr addr, netmask, broadcast;
if (ioctl(fd, SIOCGIFINDEX, &ifaux) == -1)
continue;
broadcast.s_addr = 0;
addr = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
if (ioctl(fd, SIOCGIFNETMASK, ifr) == -1)
@@ -201,7 +197,10 @@ int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), i
netmask = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
if (ioctl(fd, SIOCGIFBRDADDR, ifr) != -1)
broadcast = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr;
if (!((*ipv4_callback)(daemon, addr, (int)ifaux.ifr_index, netmask, broadcast, parm)))
if (!((*ipv4_callback)(daemon, addr,
(int)if_nametoindex(ifr->ifr_name),
netmask, broadcast,
parm)))
goto err;
}
#ifdef HAVE_IPV6
@@ -214,11 +213,9 @@ int iface_enumerate(struct daemon *daemon, void *parm, int (*ipv4_callback)(), i
addr->s6_addr[2] = 0;
addr->s6_addr[3] = 0;
}
if (ioctl(fd, SIOCGIFINDEX, &ifaux) == -1)
continue;
if (!((*ipv6_callback)(daemon, addr,
(int)((struct sockaddr_in6 *)&ifr->ifr_addr)->sin6_scope_id,
(int)ifaux.ifr_index,
(int)if_nametoindex(ifr->ifr_name),
parm)))
goto err;
}

View File

@@ -10,7 +10,7 @@
GNU General Public License for more details.
*/
#define VERSION "2.28"
#define VERSION "2.29"
#define FTABSIZ 150 /* max number of outstanding requests */
#define MAX_PROCS 20 /* max no children for TCP requests */
@@ -165,10 +165,10 @@ NOTES:
*/
/* platform independent options. */
#undef HAVE_BROKEN_RTC
#undef HAVE_ISC_READER
#undef HAVE_DBUS
/* platform independent options- uncomment to enable */
/* #define HAVE_BROKEN_RTC */
/* #define HAVE_ISC_READER */
/* #define HAVE_DBUS */
#if defined(HAVE_BROKEN_RTC) && defined(HAVE_ISC_READER)
# error HAVE_ISC_READER is not compatible with HAVE_BROKEN_RTC

View File

@@ -48,6 +48,7 @@ int main (int argc, char **argv)
{
struct daemon *daemon;
int bind_fallback = 0;
int bad_capabilities = 0;
time_t now, last = 0;
struct sigaction sigact;
struct iname *if_tmp;
@@ -95,18 +96,19 @@ int main (int argc, char **argv)
#ifdef HAVE_LINUX_NETWORK
netlink_init(daemon);
#endif
daemon->interfaces = NULL;
if (!enumerate_interfaces(daemon))
die(_("failed to find list of interfaces: %s"), NULL);
if (!(daemon->options & OPT_NOWILD) &&
!(daemon->listeners = create_wildcard_listeners(daemon->port)))
#elif !(defined(IP_RECVDSTADDR) && \
defined(IP_RECVIF) && \
defined(IP_SENDSRCADDR))
if (!(daemon->options & OPT_NOWILD))
{
bind_fallback = 1;
daemon->options |= OPT_NOWILD;
}
#endif
daemon->interfaces = NULL;
if (!enumerate_interfaces(daemon))
die(_("failed to find list of interfaces: %s"), NULL);
if (daemon->options & OPT_NOWILD)
{
@@ -123,6 +125,8 @@ int main (int argc, char **argv)
die(_("no interface with address %s"), daemon->namebuff);
}
}
else if (!(daemon->listeners = create_wildcard_listeners(daemon->port)))
die(_("failed to create listening socket: %s"), NULL);
forward_init(1);
cache_init(daemon->cachesize, daemon->options & OPT_LOG);
@@ -222,7 +226,10 @@ int main (int argc, char **argv)
/* Tell kernel to not clear capabilities when dropping root */
if (capset(hdr, data) == -1 || prctl(PR_SET_KEEPCAPS, 1) == -1)
die(_("Cannot set capabilities: %s"), NULL);
{
bad_capabilities = errno;
ent_pw = NULL;
}
}
#endif
@@ -362,7 +369,14 @@ int main (int argc, char **argv)
}
if (!(daemon->options & OPT_DEBUG) && (getuid() == 0 || geteuid() == 0))
syslog(LOG_WARNING, _("running as root"));
{
if (bad_capabilities)
{
errno = bad_capabilities;
syslog(LOG_WARNING, _("warning: setting capabilities failed: %m"));
}
syslog(LOG_WARNING, _("running as root"));
}
check_servers(daemon);

View File

@@ -36,8 +36,18 @@ void netlink_init(struct daemon *daemon)
addr.nl_groups = RTMGRP_IPV4_ROUTE;
#endif
if ((daemon->netlinkfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1 ||
bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
/* May not be able to have permission to set multicast groups don't die in that case */
if ((daemon->netlinkfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) != -1)
{
if (bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
{
addr.nl_groups = 0;
if (errno != EPERM || bind(daemon->netlinkfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
daemon->netlinkfd = -1;
}
}
if (daemon->netlinkfd == -1)
die(_("cannot create RTnetlink socket: %s"), NULL);
iov.iov_len = 200;

View File

@@ -15,43 +15,39 @@
int iface_check(struct daemon *daemon, int family, struct all_addr *addr, char *name)
{
struct iname *tmp;
int ret = 1;
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0))
return 0;
/* Note: have to check all and not bail out early, so that we set the
"used" flags. */
if (daemon->if_names || daemon->if_addrs)
{
ret = 0;
for (tmp = daemon->if_names; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0))
{
tmp->used = 1;
return 1;
}
ret = tmp->used = 1;
for (tmp = daemon->if_addrs; tmp; tmp = tmp->next)
if (tmp->addr.sa.sa_family == family)
{
if (family == AF_INET &&
tmp->addr.in.sin_addr.s_addr == addr->addr.addr4.s_addr)
{
tmp->used = 1;
return 1;
}
ret = tmp->used = 1;
#ifdef HAVE_IPV6
else if (family == AF_INET6 &&
IN6_ARE_ADDR_EQUAL(&tmp->addr.in6.sin6_addr,
&addr->addr.addr6))
{
tmp->used = 1;
return 1;
}
ret = tmp->used = 1;
#endif
}
return 0;
}
return 1;
for (tmp = daemon->if_except; tmp; tmp = tmp->next)
if (tmp->name && (strcmp(tmp->name, name) == 0))
ret = 0;
return ret;
}
static int iface_allowed(struct daemon *daemon, struct irec **irecp, int if_index,
@@ -184,9 +180,7 @@ int enumerate_interfaces(struct daemon *daemon)
#endif
}
#if defined(HAVE_IPV6) && \
(defined(HAVE_LINUX_NETWORK) || \
(defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
#if defined(HAVE_IPV6)
static int create_ipv6_listener(struct listener **link, int port)
{
union mysockaddr addr;
@@ -254,10 +248,6 @@ static int create_ipv6_listener(struct listener **link, int port)
struct listener *create_wildcard_listeners(int port)
{
#if !(defined(HAVE_LINUX_NETWORK) || (defined(IP_RECVDSTADDR) && defined(IP_RECVIF) && defined(IP_SENDSRCADDR)))
port = 0; /* eliminate warning */
return NULL;
#else
union mysockaddr addr;
int opt = 1;
struct listener *l, *l6 = NULL;
@@ -311,8 +301,6 @@ struct listener *create_wildcard_listeners(int port)
l->next = l6;
return l;
#endif
}
struct listener *create_bound_listeners(struct daemon *daemon)

View File

@@ -648,8 +648,6 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
"interface=" to disable all interfaces except loop. */
new->name = safe_string_alloc(arg);
new->isloop = new->used = 0;
if (safe_strchr(new->name, ':'))
daemon->options |= OPT_NOWILD;
arg = comma;
} while (arg);
break;
@@ -665,8 +663,6 @@ struct daemon *read_opts (int argc, char **argv, char *compile_opts)
{
new->next = daemon->if_except;
daemon->if_except = new;
if (safe_strchr(new->name, ':'))
daemon->options |= OPT_NOWILD;
}
else
{

View File

@@ -32,7 +32,7 @@ static int extract_name(HEADER *header, size_t plen, unsigned char **pp,
unsigned int label_type = l & 0xc0;
if (label_type == 0xc0) /* pointer */
{
if (p - (unsigned char *)header + 1u >= plen)
if ((size_t)(p - (unsigned char *)header + 1) >= plen)
return 0;
/* get offset */
@@ -70,7 +70,7 @@ static int extract_name(HEADER *header, size_t plen, unsigned char **pp,
/* output is \[x<hex>/siz]. which is digs+9 chars */
if (cp - (unsigned char *)name + digs + 9 >= MAXDNAME)
return 0;
if (p - (unsigned char *)header + ((count-1)>>3) + 1u >= plen)
if ((size_t)(p - (unsigned char *)header + ((count-1)>>3) + 1) >= plen)
return 0;
*cp++ = '\\';
@@ -94,7 +94,7 @@ static int extract_name(HEADER *header, size_t plen, unsigned char **pp,
{ /* label_type = 0 -> label. */
if (cp - (unsigned char *)name + l + 1 >= MAXDNAME)
return 0;
if (p - (unsigned char *)header + 1u >= plen)
if ((size_t)(p - (unsigned char *)header + 1) >= plen)
return 0;
for(j=0; j<l; j++, p++)
if (isExtract)
@@ -134,7 +134,11 @@ static int extract_name(HEADER *header, size_t plen, unsigned char **pp,
}
if (isExtract)
*--cp = 0; /* terminate: lose final period */
{
if (cp != (unsigned char *)name)
cp--;
*cp = 0; /* terminate: lose final period */
}
else if (*cp != 0)
retvalue = 2;