~ubuntu-branches/ubuntu/utopic/dnsmasq/utopic

« back to all changes in this revision

Viewing changes to src/auth.c

  • Committer: Package Import Robot
  • Author(s): Simon Kelley
  • Date: 2013-12-08 15:57:32 UTC
  • mfrom: (0.5.7) (12.2.15 sid)
  • Revision ID: package-import@ubuntu.com-20131208155732-7gg7q3hz5r91rr7j
Tags: 2.68-1
New upstream. (closes: #730553)

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
#ifdef HAVE_AUTH
20
20
 
21
 
static struct subnet *filter_zone(struct auth_zone *zone, int flag, struct all_addr *addr_u)
 
21
static struct addrlist *find_subnet(struct auth_zone *zone, int flag, struct all_addr *addr_u)
22
22
{
23
 
  struct subnet *subnet;
 
23
  struct addrlist *subnet;
24
24
 
25
25
  for (subnet = zone->subnet; subnet; subnet = subnet->next)
26
26
    {
27
 
      if (subnet->is6 && (flag & F_IPV4))
28
 
        continue;
 
27
      if (!(subnet->flags & ADDRLIST_IPV6))
 
28
        {
 
29
          struct in_addr netmask, addr = addr_u->addr.addr4;
29
30
 
30
 
      if (!subnet->is6)
31
 
        {
32
 
          struct in_addr addr = addr_u->addr.addr4;
33
 
          struct in_addr mask;
34
 
          
35
 
          mask.s_addr = htonl(~((1 << (32 - subnet->prefixlen)) - 1));
36
 
          
37
 
          if  (is_same_net(addr, subnet->addr4, mask))
 
31
          if (!(flag & F_IPV4))
 
32
            continue;
 
33
          
 
34
          netmask.s_addr = htonl(~((1 << (32 - subnet->prefixlen)) - 1));
 
35
          
 
36
          if  (is_same_net(addr, subnet->addr.addr.addr4, netmask))
38
37
            return subnet;
39
38
        }
40
39
#ifdef HAVE_IPV6
41
 
      else if (is_same_net6(&(addr_u->addr.addr6), &subnet->addr6, subnet->prefixlen))
 
40
      else if (is_same_net6(&(addr_u->addr.addr6), &subnet->addr.addr.addr6, subnet->prefixlen))
42
41
        return subnet;
43
42
#endif
44
43
 
46
45
  return NULL;
47
46
}
48
47
 
49
 
static int filter_constructed_dhcp(struct auth_zone *zone, int flag, struct all_addr *addr_u)
 
48
static int filter_zone(struct auth_zone *zone, int flag, struct all_addr *addr_u)
50
49
{
51
 
#ifdef HAVE_DHCP6
52
 
  struct dhcp_context *context;
53
 
 
54
 
  if (flag & F_IPV6)
55
 
    for (context = daemon->dhcp6; context; context = context->next)
56
 
      if ((context->flags & CONTEXT_CONSTRUCTED) &&
57
 
          !(context->flags & CONTEXT_NOAUTH) &&
58
 
          is_same_net6(&(addr_u->addr.addr6), &context->start6, context->prefix))
59
 
        return 1;
60
 
#endif
 
50
  /* No zones specified, no filter */
 
51
  if (!zone->subnet)
 
52
    return 1;
61
53
  
62
 
  return filter_zone(zone, flag, addr_u) != NULL;
 
54
  return find_subnet(zone, flag, addr_u) != NULL;
63
55
}
64
56
 
65
57
int in_zone(struct auth_zone *zone, char *name, char **cut)
99
91
  struct crec *crecp;
100
92
  int  auth = !local_query, trunc = 0, nxdomain = 1, soa = 0, ns = 0, axfr = 0;
101
93
  struct auth_zone *zone = NULL;
102
 
  struct subnet *subnet = NULL;
 
94
  struct addrlist *subnet = NULL;
103
95
  char *cut;
104
96
  struct mx_srv_record *rec, *move, **up;
105
97
  struct txt_record *txt;
147
139
          if (!local_query)
148
140
            {
149
141
              for (zone = daemon->auth_zones; zone; zone = zone->next)
150
 
                if ((subnet = filter_zone(zone, flag, &addr)))
 
142
                if ((subnet = find_subnet(zone, flag, &addr)))
151
143
                  break;
152
144
              
153
145
              if (!zone)
164
156
              {
165
157
                struct addrlist *addrlist;
166
158
                
167
 
                for (addrlist = intr->addr4; addrlist; addrlist = addrlist->next)
168
 
                  if (addr.addr.addr4.s_addr == addrlist->addr.addr.addr4.s_addr)
 
159
                for (addrlist = intr->addr; addrlist; addrlist = addrlist->next)
 
160
                  if (!(addrlist->flags & ADDRLIST_IPV6) && addr.addr.addr4.s_addr == addrlist->addr.addr.addr4.s_addr)
169
161
                    break;
170
162
                
171
163
                if (addrlist)
180
172
              {
181
173
                struct addrlist *addrlist;
182
174
                
183
 
                for (addrlist = intr->addr6; addrlist; addrlist = addrlist->next)
184
 
                  if (IN6_ARE_ADDR_EQUAL(&addr.addr.addr6, &addrlist->addr.addr.addr6))
 
175
                for (addrlist = intr->addr; addrlist; addrlist = addrlist->next)
 
176
                  if ((addrlist->flags & ADDRLIST_IPV6) && IN6_ARE_ADDR_EQUAL(&addr.addr.addr6, &addrlist->addr.addr.addr6))
185
177
                    break;
186
178
                
187
179
                if (addrlist)
362
354
           {
363
355
             struct addrlist *addrlist;
364
356
             
365
 
             addrlist = intr->addr4;
366
 
#ifdef HAVE_IPV6
367
 
             if (qtype == T_AAAA)
368
 
               addrlist = intr->addr6;
369
 
#endif  
370
357
             nxdomain = 0;
371
358
             
372
359
             if (flag)
373
 
               for (; addrlist; addrlist = addrlist->next)  
374
 
                 if (local_query || filter_constructed_dhcp(zone, flag, &addrlist->addr))
 
360
               for (addrlist = intr->addr; addrlist; addrlist = addrlist->next)  
 
361
                 if (((addrlist->flags & ADDRLIST_IPV6)  ? T_AAAA : T_A) == qtype &&
 
362
                     (local_query || filter_zone(zone, flag, &addrlist->addr)))
375
363
                   {
376
364
                     found = 1;
377
365
                     log_query(F_FORWARD | F_CONFIG | flag, name, &addrlist->addr, NULL);
468
456
                  { 
469
457
                    nxdomain = 0;
470
458
                    if ((crecp->flags & flag) && 
471
 
                        (local_query || filter_constructed_dhcp(zone, flag, &(crecp->addr.addr))))
 
459
                        (local_query || filter_zone(zone, flag, &(crecp->addr.addr))))
472
460
                      {
473
461
                        *cut = '.'; /* restore domain part */
474
462
                        log_query(crecp->flags, name, &crecp->addr.addr, record_source(crecp->uid));
491
479
            do
492
480
              { 
493
481
                 nxdomain = 0;
494
 
                 if ((crecp->flags & flag) && (local_query || filter_constructed_dhcp(zone, flag, &(crecp->addr.addr))))
 
482
                 if ((crecp->flags & flag) && (local_query || filter_zone(zone, flag, &(crecp->addr.addr))))
495
483
                   {
496
484
                     log_query(crecp->flags, name, &crecp->addr.addr, record_source(crecp->uid));
497
485
                     found = 1;
522
510
          
523
511
          authname = name;
524
512
 
525
 
          if (!subnet->is6)
 
513
          if (!(subnet->flags & ADDRLIST_IPV6))
526
514
            {
527
 
              in_addr_t a = ntohl(subnet->addr4.s_addr) >> 8;
 
515
              in_addr_t a = ntohl(subnet->addr.addr.addr4.s_addr) >> 8;
528
516
              char *p = name;
529
517
              
530
518
              if (subnet->prefixlen >= 24)
544
532
              
545
533
              for (i = subnet->prefixlen-1; i >= 0; i -= 4)
546
534
                { 
547
 
                  int dig = ((unsigned char *)&subnet->addr6)[i>>3];
 
535
                  int dig = ((unsigned char *)&subnet->addr.addr.addr6)[i>>3];
548
536
                  p += sprintf(p, "%.1x.", (i>>2) & 1 ? dig & 15 : dig >> 4);
549
537
                }
550
538
              p += sprintf(p, "ip6.arpa");
680
668
                if (cut)
681
669
                  *cut = 0;
682
670
                
683
 
                for (addrlist = intr->addr4; addrlist; addrlist = addrlist->next) 
684
 
                  if ((local_query || filter_constructed_dhcp(zone, F_IPV4,  &addrlist->addr)) && 
 
671
                for (addrlist = intr->addr; addrlist; addrlist = addrlist->next) 
 
672
                  if (!(addrlist->flags & ADDRLIST_IPV6) &&
 
673
                      (local_query || filter_zone(zone, F_IPV4, &addrlist->addr)) && 
685
674
                      add_resource_record(header, limit, &trunc, -axfroffset, &ansp, 
686
675
                                          daemon->auth_ttl, NULL, T_A, C_IN, "4", cut ? intr->name : NULL, &addrlist->addr))
687
676
                    anscount++;
688
677
                
689
678
#ifdef HAVE_IPV6
690
 
                for (addrlist = intr->addr6; addrlist; addrlist = addrlist->next) 
691
 
                  if ((local_query || filter_constructed_dhcp(zone, F_IPV6,  &addrlist->addr)) &&
 
679
                for (addrlist = intr->addr; addrlist; addrlist = addrlist->next) 
 
680
                  if ((addrlist->flags & ADDRLIST_IPV6) && 
 
681
                      (local_query || filter_zone(zone, F_IPV6, &addrlist->addr)) &&
692
682
                      add_resource_record(header, limit, &trunc, -axfroffset, &ansp, 
693
683
                                          daemon->auth_ttl, NULL, T_AAAA, C_IN, "6", cut ? intr->name : NULL, &addrlist->addr))
694
684
                    anscount++;
729
719
                    {
730
720
                      char *cache_name = cache_get_name(crecp);
731
721
                      if (!strchr(cache_name, '.') && 
732
 
                          (local_query || filter_constructed_dhcp(zone, (crecp->flags & (F_IPV6 | F_IPV4)), &(crecp->addr.addr))))
 
722
                          (local_query || filter_zone(zone, (crecp->flags & (F_IPV6 | F_IPV4)), &(crecp->addr.addr))))
733
723
                        {
734
724
                          qtype = T_A;
735
725
#ifdef HAVE_IPV6
747
737
                    {
748
738
                      strcpy(name, cache_get_name(crecp));
749
739
                      if (in_zone(zone, name, &cut) && 
750
 
                          (local_query || filter_constructed_dhcp(zone, (crecp->flags & (F_IPV6 | F_IPV4)), &(crecp->addr.addr))))
 
740
                          (local_query || filter_zone(zone, (crecp->flags & (F_IPV6 | F_IPV4)), &(crecp->addr.addr))))
751
741
                        {
752
742
                          qtype = T_A;
753
743
#ifdef HAVE_IPV6