Diff for /embedaddon/dnsmasq/src/auth.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2014/06/15 16:31:38 version 1.1.1.3, 2016/11/02 09:57:01
Line 1 Line 1
/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley/* dnsmasq is Copyright (c) 2000-2016 Simon Kelley
   
    This program is free software; you can redistribute it and/or modify     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     it under the terms of the GNU General Public License as published by
Line 31  static struct addrlist *find_subnet(struct auth_zone * Line 31  static struct addrlist *find_subnet(struct auth_zone *
           if (!(flag & F_IPV4))            if (!(flag & F_IPV4))
             continue;              continue;
                       
          netmask.s_addr = htonl(~((1 << (32 - subnet->prefixlen)) - 1));          netmask.s_addr = htonl(~(in_addr_t)0 << (32 - subnet->prefixlen));
                       
           if  (is_same_net(addr, subnet->addr.addr.addr4, netmask))            if  (is_same_net(addr, subnet->addr.addr.addr4, netmask))
             return subnet;              return subnet;
Line 81  int in_zone(struct auth_zone *zone, char *name, char * Line 81  int in_zone(struct auth_zone *zone, char *name, char *
 }  }
   
   
size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t now, union mysockaddr *peer_addr, int local_querysize_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t now, union mysockaddr *peer_addr, 
                    int local_query, int do_bit, int have_pseudoheader) 
 {  {
   char *name = daemon->namebuff;    char *name = daemon->namebuff;
   unsigned char *p, *ansp;    unsigned char *p, *ansp;
Line 131  size_t answer_auth(struct dns_header *header, char *li Line 132  size_t answer_auth(struct dns_header *header, char *li
           continue;            continue;
         }          }
   
      if (qtype == T_PTR)      if ((qtype == T_PTR || qtype == T_SOA || qtype == T_NS) &&
           (flag = in_arpa_name_2_addr(name, &addr)) &&
           !local_query)
         {          {
          if (!(flag = in_arpa_name_2_addr(name, &addr)))          for (zone = daemon->auth_zones; zone; zone = zone->next)
            continue;            if ((subnet = find_subnet(zone, flag, &addr)))
              break;
          if (!local_query)          
           if (!zone)
             {              {
              for (zone = daemon->auth_zones; zone; zone = zone->next)              auth = 0;
                if ((subnet = find_subnet(zone, flag, &addr)))              continue;
                  break; 
               
              if (!zone) 
                { 
                  auth = 0; 
                  continue; 
                } 
             }              }
             else if (qtype == T_SOA)
               soa = 1, found = 1;
             else if (qtype == T_NS)
               ns = 1, found = 1;
           }
   
         if (qtype == T_PTR && flag)
           {
           intr = NULL;            intr = NULL;
   
           if (flag == F_IPV4)            if (flag == F_IPV4)
Line 186  size_t answer_auth(struct dns_header *header, char *li Line 190  size_t answer_auth(struct dns_header *header, char *li
                       
           if (intr)            if (intr)
             {              {
              if (in_zone(zone, intr->name, NULL))              if (local_query || in_zone(zone, intr->name, NULL))
                 {                         {       
                   found = 1;                    found = 1;
                   log_query(flag | F_REVERSE | F_CONFIG, intr->name, &addr, NULL);                    log_query(flag | F_REVERSE | F_CONFIG, intr->name, &addr, NULL);
Line 208  size_t answer_auth(struct dns_header *header, char *li Line 212  size_t answer_auth(struct dns_header *header, char *li
                     *p = 0; /* must be bare name */                      *p = 0; /* must be bare name */
                                       
                   /* add  external domain */                    /* add  external domain */
                  strcat(name, ".");                  if (zone)
                  strcat(name, zone->domain);                    {
                       strcat(name, ".");
                       strcat(name, zone->domain);
                     }
                   log_query(flag | F_DHCP | F_REVERSE, name, &addr, record_source(crecp->uid));                    log_query(flag | F_DHCP | F_REVERSE, name, &addr, record_source(crecp->uid));
                   found = 1;                    found = 1;
                   if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,                     if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, 
Line 217  size_t answer_auth(struct dns_header *header, char *li Line 224  size_t answer_auth(struct dns_header *header, char *li
                                           T_PTR, C_IN, "d", name))                                            T_PTR, C_IN, "d", name))
                     anscount++;                      anscount++;
                 }                  }
              else if (crecp->flags & (F_DHCP | F_HOSTS) && in_zone(zone, name, NULL))              else if (crecp->flags & (F_DHCP | F_HOSTS) && (local_query || in_zone(zone, name, NULL)))
                 {                  {
                   log_query(crecp->flags & ~F_FORWARD, name, &addr, record_source(crecp->uid));                    log_query(crecp->flags & ~F_FORWARD, name, &addr, record_source(crecp->uid));
                   found = 1;                    found = 1;
Line 240  size_t answer_auth(struct dns_header *header, char *li Line 247  size_t answer_auth(struct dns_header *header, char *li
         }          }
               
     cname_restart:      cname_restart:
      for (zone = daemon->auth_zones; zone; zone = zone->next)      if (found)
        if (in_zone(zone, name, &cut))        /* NS and SOA .arpa requests have set found above. */
          break;        cut = NULL;
            else
      if (!zone) 
         {          {
          auth = 0;          for (zone = daemon->auth_zones; zone; zone = zone->next)
          continue;            if (in_zone(zone, name, &cut))
               break;
           
           if (!zone)
             {
               auth = 0;
               continue;
             }
         }          }
   
       for (rec = daemon->mxnames; rec; rec = rec->next)        for (rec = daemon->mxnames; rec; rec = rec->next)
Line 363  size_t answer_auth(struct dns_header *header, char *li Line 376  size_t answer_auth(struct dns_header *header, char *li
                  if (((addrlist->flags & ADDRLIST_IPV6)  ? T_AAAA : T_A) == qtype &&                   if (((addrlist->flags & ADDRLIST_IPV6)  ? T_AAAA : T_A) == qtype &&
                      (local_query || filter_zone(zone, flag, &addrlist->addr)))                       (local_query || filter_zone(zone, flag, &addrlist->addr)))
                    {                     {
   #ifdef HAVE_IPV6
                        if (addrlist->flags & ADDRLIST_REVONLY)
                          continue;
   #endif
                      found = 1;                       found = 1;
                      log_query(F_FORWARD | F_CONFIG | flag, name, &addrlist->addr, NULL);                       log_query(F_FORWARD | F_CONFIG | flag, name, &addrlist->addr, NULL);
                      if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,                        if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, 
Line 409  size_t answer_auth(struct dns_header *header, char *li Line 426  size_t answer_auth(struct dns_header *header, char *li
                 peer_addr->in.sin_port = 0;                  peer_addr->in.sin_port = 0;
 #ifdef HAVE_IPV6  #ifdef HAVE_IPV6
               else                else
                peer_addr->in6.sin6_port = 0;                 {
                   peer_addr->in6.sin6_port = 0; 
                   peer_addr->in6.sin6_scope_id = 0;
                 }
 #endif  #endif
                               
               for (peers = daemon->auth_peers; peers; peers = peers->next)                for (peers = daemon->auth_peers; peers; peers = peers->next)
Line 801  size_t answer_auth(struct dns_header *header, char *li Line 821  size_t answer_auth(struct dns_header *header, char *li
   header->ancount = htons(anscount);    header->ancount = htons(anscount);
   header->nscount = htons(authcount);    header->nscount = htons(authcount);
   header->arcount = htons(0);    header->arcount = htons(0);
   
     /* Advertise our packet size limit in our reply */
     if (have_pseudoheader)
       return add_pseudoheader(header,  ansp - (unsigned char *)header, (unsigned char *)limit, daemon->edns_pktsz, 0, NULL, 0, do_bit, 0);
   
   return ansp - (unsigned char *)header;    return ansp - (unsigned char *)header;
 }  }
       

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>