From e1792064898bbce2c4d7574ada82a06f5e19d47f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 5 Aug 2005 23:51:50 +0000 Subject: * require automake 1.9 * bump version number * fix a lot of problems detected after compilation with excessive warnings * merge patch from Sean Meiners, adding search list support * update for newer avahi git-svn-id: file:///home/lennart/svn/public/nss-mdns/trunk@82 0ee8848e-81ea-0310-a63a-f631d1a40d77 --- bootstrap.sh | 10 +- configure.ac | 6 +- src/Makefile.am | 6 +- src/avahi-test.c | 12 +-- src/avahi.c | 43 ++++++-- src/avahi.h | 1 - src/dns.c | 32 +++--- src/dns.h | 4 +- src/mdns-test.c | 2 +- src/nss-test.c | 6 +- src/nss.c | 319 ++++++++++++++++++++++++++++++++++++++++++++----------- src/query.c | 8 +- 12 files changed, 338 insertions(+), 111 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index a9feb8b..5c51524 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -17,6 +17,8 @@ # along with nss-mdns; if not, write to the Free Software Foundation, # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +VERSION=1.9 + run_versioned() { local P type -p "$1-$2" &> /dev/null && P="$1-$2" || local P="$1" @@ -27,7 +29,7 @@ run_versioned() { if [ "x$1" = "xam" ] ; then set -ex - run_versioned automake 1.8 -a -c --foreign + run_versioned automake "$VERSION" -a -c --foreign ./config.status else set -ex @@ -35,13 +37,13 @@ else rm -rf autom4te.cache rm -f config.cache - run_versioned aclocal 1.8 + run_versioned aclocal "$VERSION" libtoolize -c --force autoheader - run_versioned automake 1.8 -a -c --foreign + run_versioned automake "$VERSION" -a -c --foreign autoconf -Wall - CFLAGS="-g -O0" ./configure --sysconfdir=/etc "$@" + CFLAGS="$CFLAGS -g -O0" ./configure --sysconfdir=/etc --localstatedir=/var "$@" make clean fi diff --git a/configure.ac b/configure.ac index e8d42ce..c50c10c 100644 --- a/configure.ac +++ b/configure.ac @@ -21,15 +21,17 @@ # USA. AC_PREREQ(2.57) -AC_INIT([nss-mdns],[0.5],[mzaffzqaf (at) 0pointer (dot) de]) +AC_INIT([nss-mdns],[0.6],[mzaffzqaf (at) 0pointer (dot) de]) AC_CONFIG_SRCDIR([src/query.c]) AC_CONFIG_HEADERS([config.h]) -AM_INIT_AUTOMAKE([foreign -Wall]) +AM_INIT_AUTOMAKE([foreign 1.9 -Wall]) AC_SUBST(PACKAGE_URL, [http://0pointer.de/lennart/projects/nss-mdns/]) ac_default_prefix="/" +AC_GNU_SOURCE + # Checks for programs. AC_PROG_CC AC_PROG_CPP diff --git a/src/Makefile.am b/src/Makefile.am index ac24af2..6e537cf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,7 +17,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA. -AM_CFLAGS=-D_GNU_SOURCE -DMDNS_ALLOW_FILE=\"$(sysconfdir)/mdns.allow\" +AM_CFLAGS = \ + -DMDNS_ALLOW_FILE=\"$(sysconfdir)/mdns.allow\" \ + -DRESOLV_CONF_FILE=\"$(sysconfdir)/resolv.conf\" \ + -DAVAHI_SOCKET=\"$(localstatedir)/run/avahi-daemon/socket\" + #-DNDEBUG=1 # This cool debug trap works on i386/gcc only diff --git a/src/avahi-test.c b/src/avahi-test.c index e66421e..b1be16d 100644 --- a/src/avahi-test.c +++ b/src/avahi-test.c @@ -29,17 +29,17 @@ int main(int argc, char *argv[]) { char t[256]; int r; - if ((r = avahi_resolve_name(AF_INET, argc >= 2 ? argv[1] : "whiskey.local", data)) == 0) + if ((r = avahi_resolve_name(AF_INET, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0) printf("AF_INET: %s\n", inet_ntop(AF_INET, data, t, sizeof(t))); else printf("AF_INET: failed (%i).\n", r); - if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "whiskey.local", data)) == 0) - printf("AF_INET6: %s\n", inet_ntop(AF_INET6, data, t, sizeof(t))); - else - printf("AF_INET6: failed (%i).\n", r); +/* if ((r = avahi_resolve_name(AF_INET6, argc >= 2 ? argv[1] : "cocaine.local", data)) == 0) */ +/* printf("AF_INET6: %s\n", inet_ntop(AF_INET6, data, t, sizeof(t))); */ +/* else */ +/* printf("AF_INET6: failed (%i).\n", r); */ - if ((r = avahi_resolve_address(AF_INET6, data, t, sizeof(t))) == 0) + if ((r = avahi_resolve_address(AF_INET, data, t, sizeof(t))) == 0) printf("REVERSE: %s\n", t); else printf("REVERSE: failed (%i).\n", r); diff --git a/src/avahi.c b/src/avahi.c index cd4db00..96ce615 100644 --- a/src/avahi.c +++ b/src/avahi.c @@ -19,6 +19,9 @@ USA. ***/ +#ifdef HAVE_CONFIG_H +#include +#endif #include #include @@ -32,7 +35,7 @@ #include "avahi.h" #include "util.h" -#define AVAHI_SOCKET "/var/run/avahi/socket" +#define WHITESPACE " \t" static FILE *open_socket(void) { int fd = -1; @@ -67,7 +70,7 @@ fail: int avahi_resolve_name(int af, const char* name, void* data) { FILE *f; - char *e, *p; + char *p; int ret = -1; char ln[256]; @@ -88,9 +91,22 @@ int avahi_resolve_name(int af, const char* name, void* data) { } p = ln+1; - p += strspn(p, "\t "); - e = p + strcspn(p, "\n\r\t "); - *e = 0; + p += strspn(p, WHITESPACE); + + /* Skip interface */ + p += strcspn(p, WHITESPACE); + p += strspn(p, WHITESPACE); + + /* Skip protocol */ + p += strcspn(p, WHITESPACE); + p += strspn(p, WHITESPACE); + + /* Skip host name */ + p += strcspn(p, WHITESPACE); + p += strspn(p, WHITESPACE); + + /* Cut off end of line */ + *(p + strcspn(p, "\n\r\t ")) = 0; if (inet_pton(af, p, data) <= 0) goto finish; @@ -107,7 +123,7 @@ finish: int avahi_resolve_address(int af, const void *data, char* name, size_t name_len) { FILE *f; - char *e, *p; + char *p; int ret = -1; char a[256], ln[256]; @@ -127,9 +143,18 @@ int avahi_resolve_address(int af, const void *data, char* name, size_t name_len) } p = ln+1; - p += strspn(p, "\t "); - e = p + strcspn(p, "\n\r\t "); - *e = 0; + p += strspn(p, WHITESPACE); + + /* Skip interface */ + p += strcspn(p, WHITESPACE); + p += strspn(p, WHITESPACE); + + /* Skip protocol */ + p += strcspn(p, WHITESPACE); + p += strspn(p, WHITESPACE); + + /* Cut off end of line */ + *(p + strcspn(p, "\n\r\t ")) = 0; strncpy(name, p, name_len-1); name[name_len-1] = 0; diff --git a/src/avahi.h b/src/avahi.h index 79d1c86..5315b80 100644 --- a/src/avahi.h +++ b/src/avahi.h @@ -22,7 +22,6 @@ USA. ***/ - #include #include diff --git a/src/dns.c b/src/dns.c index b32dc2f..61c66d8 100644 --- a/src/dns.c +++ b/src/dns.c @@ -46,16 +46,16 @@ void dns_packet_free(struct dns_packet *p) { free(p); } -void dns_packet_set_field(struct dns_packet *p, unsigned index, uint16_t v) { - assert(p && index < 2*6); +void dns_packet_set_field(struct dns_packet *p, unsigned idx, uint16_t v) { + assert(p && idx < 2*6); - ((uint16_t*) p->data)[index] = htons(v); + ((uint16_t*) p->data)[idx] = htons(v); } -uint16_t dns_packet_get_field(struct dns_packet *p, unsigned index) { - assert(p && index < 2*6); +uint16_t dns_packet_get_field(struct dns_packet *p, unsigned idx) { + assert(p && idx < 2*6); - return ntohs(((uint16_t*) p->data)[index]); + return ntohs(((uint16_t*) p->data)[idx]); } uint8_t* dns_packet_append_name(struct dns_packet *p, const char *name) { @@ -161,7 +161,7 @@ int dns_packet_check_valid_response(struct dns_packet *p) { } -static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name, size_t l) { +static ssize_t consume_labels(struct dns_packet *p, size_t idx, char *ret_name, size_t l) { ssize_t ret = 0; int compressed = 0; int first_label = 1; @@ -170,13 +170,13 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name for (;;) { uint8_t n; - if (index+1 > p->size) + if (idx+1 > p->size) return -1; - n = p->data[index]; + n = p->data[idx]; if (!n) { - index++; + idx++; if (!compressed) ret++; @@ -188,11 +188,11 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name } else if (n <= 63) { /* Uncompressed label */ - index++; + idx++; if (!compressed) ret++; - if (index + n > p->size) + if (idx + n > p->size) return -1; if ((size_t) n + 1 > l) @@ -204,8 +204,8 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name } else first_label = 0; - memcpy(ret_name, p->data + index, n); - index += n; + memcpy(ret_name, p->data + idx, n); + idx += n; ret_name += n; l -= n; @@ -214,10 +214,10 @@ static ssize_t consume_labels(struct dns_packet *p, size_t index, char *ret_name } else if ((n & 0xC0) == 0xC0) { /* Compressed label */ - if (index+2 > p->size) + if (idx+2 > p->size) return -1; - index = ((size_t) (p->data[index] & ~0xC0)) << 8 | p->data[index+1]; + idx = ((size_t) (p->data[idx] & ~0xC0)) << 8 | p->data[idx+1]; if (!compressed) ret += 2; diff --git a/src/dns.h b/src/dns.h index 13e0f1d..54803ab 100644 --- a/src/dns.h +++ b/src/dns.h @@ -32,8 +32,8 @@ struct dns_packet { struct dns_packet* dns_packet_new(void); void dns_packet_free(struct dns_packet *p); -void dns_packet_set_field(struct dns_packet *p, unsigned index, uint16_t v); -uint16_t dns_packet_get_field(struct dns_packet *p, unsigned index); +void dns_packet_set_field(struct dns_packet *p, unsigned idx, uint16_t v); +uint16_t dns_packet_get_field(struct dns_packet *p, unsigned idx); uint8_t *dns_packet_append_uint16(struct dns_packet *p, uint16_t v); uint8_t *dns_packet_append_name(struct dns_packet *p, const char *name); diff --git a/src/mdns-test.c b/src/mdns-test.c index e3c7981..81c0625 100644 --- a/src/mdns-test.c +++ b/src/mdns-test.c @@ -30,7 +30,7 @@ #include "query.h" static void ipv4_func(const ipv4_address_t *ipv4, void *userdata) { - fprintf(stderr, "IPV4: %s\n", inet_ntoa(*(struct in_addr*) &ipv4->address)); + fprintf(stderr, "IPV4: %s\n", inet_ntoa(*(const struct in_addr*) &ipv4->address)); } static void ipv6_func(const ipv6_address_t *ipv6, void *userdata) { diff --git a/src/nss-test.c b/src/nss-test.c index 78aecde..6418566 100644 --- a/src/nss-test.c +++ b/src/nss-test.c @@ -32,7 +32,7 @@ int main(int argc, char *argv[]) { struct hostent *he; in_addr_t **a; - char *arg= argc > 1 ? argv[1] : "whiskey.local"; + const char *arg= argc > 1 ? argv[1] : "cocaine.local"; uint8_t t[256]; if (inet_pton(AF_INET, arg, &t) > 0) @@ -64,8 +64,8 @@ int main(int argc, char *argv[]) { fprintf(stderr, "addresses:"); for (a = (in_addr_t**) he->h_addr_list; *a; a++) { - char t[256]; - fprintf(stderr, " %s", inet_ntop(he->h_addrtype, *a, t, sizeof(t))); + char txt[256]; + fprintf(stderr, " %s", inet_ntop(he->h_addrtype, *a, txt, sizeof(txt))); } fprintf(stderr, "\n"); diff --git a/src/nss.c b/src/nss.c index c54db7b..e8746fe 100644 --- a/src/nss.c +++ b/src/nss.c @@ -1,22 +1,22 @@ /* $Id$ */ /*** - This file is part of nss-mdns. + This file is part of nss-mdns. - nss-mdns is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2 of the License, - or (at your option) any later version. + nss-mdns is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. - nss-mdns is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + nss-mdns is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - You should have received a copy of the GNU Lesser General Public License - along with nss-mdns; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA. + You should have received a copy of the GNU Lesser General Public License + along with nss-mdns; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. ***/ #ifdef HAVE_CONFIG_H @@ -31,6 +31,7 @@ #include #include #include +#include #include "query.h" @@ -50,6 +51,9 @@ #define _nss_mdns_gethostbyaddr_r _nss_mdns6_gethostbyaddr_r #endif +/* the resolv conf page states that they only support 6 domains */ +#define MAX_SEARCH_DOMAINS 6 + struct userdata { int count; int data_len; /* only valid when doing reverse lookup */ @@ -149,6 +153,110 @@ static int verify_name_allowed(const char *name) { return valid; } +static char **alloc_domains(unsigned ndomains) { + char **domains; + + if (!(domains = malloc(sizeof(char*) * ndomains))) + return NULL; + + /* initialize them all to 0 */ + memset(domains, 0, sizeof(char*) * ndomains); + return domains; +} + +static void free_domains(char **domains) { + char **p; + + if (!domains) + return; + + for(p = domains; *p; p++) + free(*p); + + free(domains); +} + +static char** parse_domains(const char *domains_in) { + /* leave room for the NULL terminator */ + char **domains_out; + const char *start = domains_in; + unsigned domain = 0; + + if (!(domains_out = alloc_domains(MAX_SEARCH_DOMAINS+1))) + return NULL; + + while (domain < MAX_SEARCH_DOMAINS) { + const char *end; + char *tmp; + size_t domain_len; + + end = start + strcspn(start, " \t\r\n"); + domain_len = (end - start); + + if (!(tmp = malloc(domain_len + 1))) + break; + + memcpy(tmp, start, domain_len); + tmp[domain_len] = '\0'; + + domains_out[domain++] = tmp; + + end += strspn(end," \t\r\n"); + + if (!*end) + break; + + start = end; + } + + return domains_out; +} + +static char** get_search_domains(void) { + FILE *f = 0; + char **domains = NULL; + + /* according to the resolv.conf man page (in Linux) the LOCALDOMAIN + environment variable should override the settings in the resolv.conf file */ + char *line = getenv("LOCALDOMAIN"); + if (line && *line != 0) + return parse_domains(line); + + if (!(f = fopen(RESOLV_CONF_FILE, "r"))) + return NULL; + + while (!feof(f)) { + char *start = NULL; + char ln[512]; + + if (!fgets(ln, sizeof(ln), f)) + break; + + start = ln + strspn(ln, " \t\r\n"); + + if (strncmp(start, "search", 6) && strncmp(start, "domain", 6)) + continue; + + if (start[6] != ' ' && start[6] != '\t') + continue; + + /* scan to the end of the keyword ('search' or 'domain' currently) */ + start += strcspn(start, " \t\r\n"); + + /* find the begining of the first domain in the list */ + start += strspn(start, " \t\r\n"); + + /* the resolv.conf manpage also states that 'search' and 'domain' are mutually exclusive + and that the last one wins. */ + free_domains(domains); + domains = parse_domains(start); + } + + fclose(f); + + return domains; +} + enum nss_status _nss_mdns_gethostbyname2_r( const char *name, int af, @@ -160,12 +268,14 @@ enum nss_status _nss_mdns_gethostbyname2_r( struct userdata u; enum nss_status status = NSS_STATUS_UNAVAIL; - int fd = -1, r, i; - size_t address_length, l, index, astart; + int fd = -1, i; + size_t address_length, l, idx, astart; void (*ipv4_func)(const ipv4_address_t *ipv4, void *userdata); void (*ipv6_func)(const ipv6_address_t *ipv6, void *userdata); + int name_allowed; #ifdef ENABLE_AVAHI + int avahi_works = 1; uint8_t data[128]; #endif @@ -184,13 +294,6 @@ enum nss_status _nss_mdns_gethostbyname2_r( goto finish; } - if (! verify_name_allowed(name)) { - *errnop = ENOENT; - *h_errnop = HOST_NOT_FOUND; - status = NSS_STATUS_NOTFOUND; - goto finish; - } - address_length = af == AF_INET ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t); if (buflen < sizeof(char*)+ /* alias names */ @@ -218,51 +321,143 @@ enum nss_status _nss_mdns_gethostbyname2_r( ipv6_func = af == AF_INET6 ? ipv6_callback : NULL; #endif + name_allowed = verify_name_allowed(name); + #ifdef ENABLE_AVAHI - if ((r = avahi_resolve_name(af, name, data)) == 0) { - if (af == AF_INET && ipv4_func) - ipv4_func((ipv4_address_t*) data, &u); - if (af == AF_INET6 && ipv4_func) - ipv6_func((ipv6_address_t*)data, &u); - } else if (r > 0) { - *errnop = ETIMEDOUT; - *h_errnop = HOST_NOT_FOUND; - goto finish; + if (avahi_works && name_allowed) { + int r; + + if ((r = avahi_resolve_name(af, name, data)) < 0) + avahi_works = 0; + else if (r == 0) { + if (af == AF_INET && ipv4_func) + ipv4_func((ipv4_address_t*) data, &u); + if (af == AF_INET6 && ipv6_func) + ipv6_func((ipv6_address_t*)data, &u); + } + } - + + if (u.count == 0 && avahi_works && !ends_with(name, ".")) { + char **domains; + + if ((domains = get_search_domains())) { + char **p; + + /* Try to concatenate host names */ + for (p = domains; *p; p++) { + int fullnamesize; + char *fullname; + + fullnamesize = strlen(name) + strlen(*p) + 2; + + if (!(fullname = malloc(fullnamesize))) + break; + + snprintf(fullname, fullnamesize, "%s.%s", name, *p); + + if (verify_name_allowed(fullname)) { + int r; + + r = avahi_resolve_name(af, fullname, data); + free(fullname); + + if (r < 0) { + avahi_works = 0; + break; + } else if (r == 0) { + if (af == AF_INET && ipv4_func) + ipv4_func((ipv4_address_t*) data, &u); + if (af == AF_INET6 && ipv6_func) + ipv6_func((ipv6_address_t*)data, &u); + break; + } + + } else + free(fullname); + } + + free_domains(domains); + } + } + + + if (u.count == 0 && !avahi_works) { #endif - if (u.count == 0) { if ((fd = mdns_open_socket()) < 0) { - *errnop = errno; *h_errnop = NO_RECOVERY; goto finish; } - - if ((r = mdns_query_name(fd, name, ipv4_func, ipv6_func, &u)) < 0) { - *errnop = ETIMEDOUT; - *h_errnop = HOST_NOT_FOUND; - goto finish; + + if (name_allowed) + /* Ignore return value */ + mdns_query_name(fd, name, ipv4_func, ipv6_func, &u); + + if (u.count == 0 && !ends_with(name, ".")) { + char **domains; + + /* Try the search domains if the user did not use a traling '.' */ + + if ((domains = get_search_domains())) { + char **p; + + for (p = domains; *p; p++) { + int fullnamesize = 0; + char *fullname = NULL; + + fullnamesize = strlen(name) + strlen(*p) + 2; + if (!(fullname = malloc(fullnamesize))) + break; + + snprintf(fullname, fullnamesize, "%s.%s", name, *p); + + if (verify_name_allowed(fullname)) { + + /* Ignore return value */ + mdns_query_name(fd, fullname, ipv4_func, ipv6_func, &u); + + if (u.count > 0) { + /* We found somethings, so let's quit */ + free(fullname); + break; + } + } + + free(fullname); + } + + free_domains(domains); + } } + +#ifdef ENABLE_AVAHI } - +#endif + + if (u.count == 0) { + *errnop = ETIMEDOUT; + *h_errnop = HOST_NOT_FOUND; + goto finish; + } + /* Alias names */ *((char**) buffer) = NULL; result->h_aliases = (char**) buffer; - index = sizeof(char*); + idx = sizeof(char*); /* Official name */ - strcpy(buffer+index, name); - result->h_name = buffer+index; - index += strlen(name)+1; + strcpy(buffer+idx, name); + result->h_name = buffer+idx; + idx += strlen(name)+1; result->h_addrtype = af; result->h_length = address_length; /* Check if there's enough space for the addresses */ - if (buflen < index+u.data_len+sizeof(char*)*(u.count+1)) { + if (buflen < idx+u.data_len+sizeof(char*)*(u.count+1)) { *errnop = ERANGE; *h_errnop = NO_RECOVERY; status = NSS_STATUS_TRYAGAIN; @@ -270,17 +465,17 @@ enum nss_status _nss_mdns_gethostbyname2_r( } /* Addresses */ - astart = index; + astart = idx; l = u.count*address_length; memcpy(buffer+astart, &u.data, l); - index += l; + idx += l; /* Address array */ for (i = 0; i < u.count; i++) - ((char**) (buffer+index))[i] = buffer+astart+address_length*i; - ((char**) (buffer+index))[i] = NULL; + ((char**) (buffer+idx))[i] = buffer+astart+address_length*i; + ((char**) (buffer+idx))[i] = NULL; - result->h_addr_list = (char**) (buffer+index); + result->h_addr_list = (char**) (buffer+idx); status = NSS_STATUS_SUCCESS; @@ -326,7 +521,7 @@ enum nss_status _nss_mdns_gethostbyaddr_r( struct userdata u; enum nss_status status = NSS_STATUS_UNAVAIL; int fd = -1, r; - size_t address_length, index, astart; + size_t address_length, idx, astart; #ifdef ENABLE_AVAHI char t[256]; #endif @@ -389,13 +584,13 @@ enum nss_status _nss_mdns_gethostbyaddr_r( if (af == AF_INET) #endif #ifndef NSS_IPV6_ONLY - r = mdns_query_ipv4(fd, (ipv4_address_t*) addr, name_callback, &u); + r = mdns_query_ipv4(fd, (const ipv4_address_t*) addr, name_callback, &u); #endif #if ! defined(NSS_IPV6_ONLY) && ! defined(NSS_IPV4_ONLY) else #endif #ifndef NSS_IPV4_ONLY - r = mdns_query_ipv6(fd, (ipv6_address_t*) addr, name_callback, &u); + r = mdns_query_ipv6(fd, (const ipv6_address_t*) addr, name_callback, &u); #endif if (r < 0) { @@ -408,7 +603,7 @@ enum nss_status _nss_mdns_gethostbyaddr_r( /* Alias names */ *((char**) buffer) = NULL; result->h_aliases = (char**) buffer; - index = sizeof(char*); + idx = sizeof(char*); assert(u.count > 0 && u.data.name[0]); if (buflen < @@ -424,22 +619,22 @@ enum nss_status _nss_mdns_gethostbyaddr_r( } /* Official name */ - strcpy(buffer+index, u.data.name[0]); - result->h_name = buffer+index; - index += strlen(u.data.name[0])+1; + strcpy(buffer+idx, u.data.name[0]); + result->h_name = buffer+idx; + idx += strlen(u.data.name[0])+1; result->h_addrtype = af; result->h_length = address_length; /* Address */ - astart = index; + astart = idx; memcpy(buffer+astart, addr, address_length); - index += address_length; + idx += address_length; /* Address array */ - ((char**) (buffer+index))[0] = buffer+astart; - ((char**) (buffer+index))[1] = NULL; - result->h_addr_list = (char**) (buffer+index); + ((char**) (buffer+idx))[0] = buffer+astart; + ((char**) (buffer+idx))[1] = NULL; + result->h_addr_list = (char**) (buffer+idx); status = NSS_STATUS_SUCCESS; diff --git a/src/query.c b/src/query.c index 32401fc..8079a3d 100644 --- a/src/query.c +++ b/src/query.c @@ -171,13 +171,13 @@ static int send_dns_packet(int fd, struct dns_packet *p) { } for (i = 0, n = ifconf.ifc_len/sizeof(struct ifreq); i < n; i++) { - struct sockaddr_in *sa; + struct sockaddr_in *ifsa; u_int32_t s_addr; /* Check if this is the loopback device or any other invalid interface */ - sa = (struct sockaddr_in*) &ifreq[i].ifr_addr; - s_addr = htonl(sa->sin_addr.s_addr); - if (sa->sin_family != AF_INET || + ifsa = (struct sockaddr_in*) &ifreq[i].ifr_addr; + s_addr = htonl(ifsa->sin_addr.s_addr); + if (ifsa->sin_family != AF_INET || s_addr == INADDR_LOOPBACK || s_addr == INADDR_ANY || s_addr == INADDR_BROADCAST) -- cgit