Diff for /embedaddon/dnsmasq/src/domain.c between versions 1.1.1.3 and 1.1.1.4

version 1.1.1.3, 2021/03/17 00:56:46 version 1.1.1.4, 2023/09/27 11:02:07
Line 1 Line 1
/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley/* dnsmasq is Copyright (c) 2000-2022 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 18 Line 18
   
   
 static struct cond_domain *search_domain(struct in_addr addr, struct cond_domain *c);  static struct cond_domain *search_domain(struct in_addr addr, struct cond_domain *c);
   static int match_domain(struct in_addr addr, struct cond_domain *c);
 static struct cond_domain *search_domain6(struct in6_addr *addr, struct cond_domain *c);  static struct cond_domain *search_domain6(struct in6_addr *addr, struct cond_domain *c);
   static int match_domain6(struct in6_addr *addr, struct cond_domain *c);
   
   
 int is_name_synthetic(int flags, char *name, union all_addr *addr)  int is_name_synthetic(int flags, char *name, union all_addr *addr)
 {  {
   char *p;    char *p;
Line 135  int is_name_synthetic(int flags, char *name, union all Line 136  int is_name_synthetic(int flags, char *name, union all
             }              }
                       
           if (hostname_isequal(c->domain, p+1) && inet_pton(prot, tail, addr))            if (hostname_isequal(c->domain, p+1) && inet_pton(prot, tail, addr))
            {            found = (prot == AF_INET) ? match_domain(addr->addr4, c) : match_domain6(&addr->addr6, c);
              if (prot == AF_INET) 
                { 
                  if (!c->is6 && 
                      ntohl(addr->addr4.s_addr) >= ntohl(c->start.s_addr) && 
                      ntohl(addr->addr4.s_addr) <= ntohl(c->end.s_addr)) 
                    found = 1; 
                } 
              else 
                { 
                  u64 addrpart = addr6part(&addr->addr6); 
                   
                  if (c->is6 && 
                      is_same_net6(&addr->addr6, &c->start6, 64) && 
                      addrpart >= addr6part(&c->start6) && 
                      addrpart <= addr6part(&c->end6)) 
                    found = 1; 
                } 
            } 
 
         }          }
      
       /* restore name */        /* restore name */
       for (p = tail; *p; p++)        for (p = tail; *p; p++)
         if (*p == '.' || *p == ':')          if (*p == '.' || *p == ':')
Line 246  int is_rev_synth(int flag, union all_addr *addr, char  Line 228  int is_rev_synth(int flag, union all_addr *addr, char 
 }  }
   
   
   static int match_domain(struct in_addr addr, struct cond_domain *c)
   {
     if (c->interface)
       {
         struct addrlist *al;
         for (al = c->al; al; al = al->next)
           if (!(al->flags & ADDRLIST_IPV6) &&
               is_same_net_prefix(addr, al->addr.addr4, al->prefixlen))
             return 1;
       }
     else if (!c->is6 &&
              ntohl(addr.s_addr) >= ntohl(c->start.s_addr) &&
              ntohl(addr.s_addr) <= ntohl(c->end.s_addr))
       return 1;
   
     return 0;
   }
   
 static struct cond_domain *search_domain(struct in_addr addr, struct cond_domain *c)  static struct cond_domain *search_domain(struct in_addr addr, struct cond_domain *c)
 {  {
   for (; c; c = c->next)    for (; c; c = c->next)
    if (!c->is6 &&    if (match_domain(addr, c))
        ntohl(addr.s_addr) >= ntohl(c->start.s_addr) && 
        ntohl(addr.s_addr) <= ntohl(c->end.s_addr)) 
       return c;        return c;
  
   return NULL;    return NULL;
 }  }
   
Line 267  char *get_domain(struct in_addr addr) Line 265  char *get_domain(struct in_addr addr)
   return daemon->domain_suffix;    return daemon->domain_suffix;
 }   } 
   
   static int match_domain6(struct in6_addr *addr, struct cond_domain *c)
   {
       
     /* subnet from interface address. */
     if (c->interface)
       {
         struct addrlist *al;
         for (al = c->al; al; al = al->next)
           if (al->flags & ADDRLIST_IPV6 &&
               is_same_net6(addr, &al->addr.addr6, al->prefixlen))
             return 1;
       }
     else if (c->is6)
       {
         if (c->prefixlen >= 64)
           {
             u64 addrpart = addr6part(addr);
             if (is_same_net6(addr, &c->start6, 64) &&
                 addrpart >= addr6part(&c->start6) &&
                 addrpart <= addr6part(&c->end6))
               return 1;
           }
         else if (is_same_net6(addr, &c->start6, c->prefixlen))
           return 1;
       }
       
     return 0;
   }
   
 static struct cond_domain *search_domain6(struct in6_addr *addr, struct cond_domain *c)  static struct cond_domain *search_domain6(struct in6_addr *addr, struct cond_domain *c)
 {  {
   u64 addrpart = addr6part(addr);  
     
   for (; c; c = c->next)    for (; c; c = c->next)
    if (c->is6 &&    if (match_domain6(addr, c))
        is_same_net6(addr, &c->start6, 64) && 
        addrpart >= addr6part(&c->start6) && 
        addrpart <= addr6part(&c->end6)) 
       return c;        return c;
       
   return NULL;    return NULL;

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


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