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; |