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

version 1.1.1.2, 2021/03/17 00:56:46 version 1.1.1.3, 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 156  static int check_rrs(unsigned char *p, struct dns_head Line 156  static int check_rrs(unsigned char *p, struct dns_head
 }  }
                   
   
/* mode is 0 to remove EDNS0, 1 to filter DNSSEC RRs *//* mode may be remove EDNS0 or DNSSEC RRs or remove A or AAAA from answer section. */
 size_t rrfilter(struct dns_header *header, size_t plen, int mode)  size_t rrfilter(struct dns_header *header, size_t plen, int mode)
 {  {
  static unsigned char **rrs;  static unsigned char **rrs = NULL;
   static int rr_sz = 0;    static int rr_sz = 0;
   
   unsigned char *p = (unsigned char *)(header+1);    unsigned char *p = (unsigned char *)(header+1);
Line 192  size_t rrfilter(struct dns_header *header, size_t plen Line 192  size_t rrfilter(struct dns_header *header, size_t plen
       if (!ADD_RDLEN(header, p, plen, rdlen))        if (!ADD_RDLEN(header, p, plen, rdlen))
         return plen;          return plen;
   
      /* Don't remove the answer. */      if (mode == RRFILTER_EDNS0) /* EDNS */
      if (i < ntohs(header->ancount) && type == qtype && class == qclass) 
        continue; 
       
      if (mode == 0) /* EDNS */ 
         {          {
           /* EDNS mode, remove T_OPT from additional section only */            /* EDNS mode, remove T_OPT from additional section only */
           if (i < (ntohs(header->nscount) + ntohs(header->ancount)) || type != T_OPT)            if (i < (ntohs(header->nscount) + ntohs(header->ancount)) || type != T_OPT)
             continue;              continue;
         }          }
      else if (type != T_NSEC && type != T_NSEC3 && type != T_RRSIG)      else if (mode == RRFILTER_DNSSEC)
        /* DNSSEC mode, remove SIGs and NSECs from all three sections. */        {
        continue;          if (type != T_NSEC && type != T_NSEC3 && type != T_RRSIG)
             /* DNSSEC mode, remove SIGs and NSECs from all three sections. */
             continue;
 
           /* Don't remove the answer. */
           if (i < ntohs(header->ancount) && type == qtype && class == qclass)
             continue;
         }
       else
         {
           /* Only looking at answer section now. */
           if (i >= ntohs(header->ancount))
             break;
 
           if (class != C_IN)
             continue;
           
           if (mode == RRFILTER_A && type != T_A)
             continue;
 
           if (mode == RRFILTER_AAAA && type != T_AAAA)
             continue;
         }
               
         
       if (!expand_workspace(&rrs, &rr_sz, rr_found + 1))        if (!expand_workspace(&rrs, &rr_sz, rr_found + 1))
         return plen;           return plen; 
               
Line 322  int expand_workspace(unsigned char ***wkspc, int *szp, Line 339  int expand_workspace(unsigned char ***wkspc, int *szp,
     return 0;      return 0;
   
   new += 5;    new += 5;
  
  if (!(p = whine_malloc(new * sizeof(unsigned char *))))  if (!(p = whine_realloc(*wkspc, new * sizeof(unsigned char *))))
    return 0;      return 0;
  
  if (old != 0 && *wkspc)  memset(p+old, 0, new-old);
    { 
      memcpy(p, *wkspc, old * sizeof(unsigned char *)); 
      free(*wkspc); 
    } 
       
   *wkspc = p;    *wkspc = p;
   *szp = new;    *szp = new;

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


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