Home | History | Annotate | Line # | Download | only in testcode
      1 /*
      2  * testpkts. Data file parse for test packets, and query matching.
      3  *
      4  * Data storage for specially crafted replies for testing purposes.
      5  *
      6  * (c) NLnet Labs, 2005, 2006, 2007, 2008
      7  * See the file LICENSE for the license
      8  */
      9 
     10 /**
     11  * \file
     12  * This is a debugging aid. It is not efficient, especially
     13  * with a long config file, but it can give any reply to any query.
     14  * This can help the developer pre-script replies for queries.
     15  *
     16  * You can specify a packet RR by RR with header flags to return.
     17  *
     18  * Missing features:
     19  *		- matching content different from reply content.
     20  *		- find way to adjust mangled packets?
     21  */
     22 
     23 #include "config.h"
     24 #include <errno.h>
     25 #include <stdarg.h>
     26 #include <ctype.h>
     27 #include "testcode/testpkts.h"
     28 #include "util/net_help.h"
     29 #include "sldns/sbuffer.h"
     30 #include "sldns/rrdef.h"
     31 #include "sldns/pkthdr.h"
     32 #include "sldns/str2wire.h"
     33 #include "sldns/wire2str.h"
     34 
     35 /** max size of a packet */
     36 #define MAX_PACKETLEN 65536
     37 /** max line length */
     38 #define MAX_LINE   10240
     39 /** string to show in warnings and errors */
     40 static const char* prog_name = "testpkts";
     41 
     42 #ifndef UTIL_LOG_H
     43 /** verbosity definition for compat */
     44 enum verbosity_value { NO_VERBOSE=0 };
     45 #endif
     46 /** logging routine, provided by caller */
     47 void verbose(enum verbosity_value lvl, const char* msg, ...) ATTR_FORMAT(printf, 2, 3);
     48 static void error(const char* msg, ...) ATTR_NORETURN;
     49 
     50 /** print error and exit */
     51 static void error(const char* msg, ...)
     52 {
     53 	va_list args;
     54 	va_start(args, msg);
     55 	fprintf(stderr, "%s error: ", prog_name);
     56 	vfprintf(stderr, msg, args);
     57 	fprintf(stderr, "\n");
     58 	fflush(stderr);
     59 	va_end(args);
     60 	exit(EXIT_FAILURE);
     61 }
     62 
     63 /** return if string is empty or comment */
     64 static int isendline(char c)
     65 {
     66 	if(c == ';' || c == '#'
     67 		|| c == '\n' || c == 0)
     68 		return 1;
     69 	return 0;
     70 }
     71 
     72 /** true if the string starts with the keyword given. Moves the str ahead.
     73  * @param str: before keyword, afterwards after keyword and spaces.
     74  * @param keyword: the keyword to match
     75  * @return: true if keyword present. False otherwise, and str unchanged.
     76 */
     77 static int str_keyword(char** str, const char* keyword)
     78 {
     79 	size_t len = strlen(keyword);
     80 	assert(str && keyword);
     81 	if(strncmp(*str, keyword, len) != 0)
     82 		return 0;
     83 	*str += len;
     84 	while(isspace((unsigned char)**str))
     85 		(*str)++;
     86 	return 1;
     87 }
     88 
     89 /** Add reply packet to entry */
     90 static struct reply_packet*
     91 entry_add_reply(struct entry* entry)
     92 {
     93 	struct reply_packet* pkt = (struct reply_packet*)malloc(
     94 		sizeof(struct reply_packet));
     95 	struct reply_packet ** p = &entry->reply_list;
     96 	if(!pkt) error("out of memory");
     97 	pkt->next = NULL;
     98 	pkt->packet_sleep = 0;
     99 	pkt->reply_pkt = NULL;
    100 	pkt->reply_from_hex = NULL;
    101 	pkt->raw_ednsdata = NULL;
    102 	/* link at end */
    103 	while(*p)
    104 		p = &((*p)->next);
    105 	*p = pkt;
    106 	return pkt;
    107 }
    108 
    109 /** parse MATCH line */
    110 static void matchline(char* line, struct entry* e)
    111 {
    112 	char* parse = line;
    113 	while(*parse) {
    114 		if(isendline(*parse))
    115 			return;
    116 		if(str_keyword(&parse, "opcode")) {
    117 			e->match_opcode = 1;
    118 		} else if(str_keyword(&parse, "qtype")) {
    119 			e->match_qtype = 1;
    120 		} else if(str_keyword(&parse, "qname")) {
    121 			e->match_qname = 1;
    122 		} else if(str_keyword(&parse, "rcode")) {
    123 			e->match_rcode = 1;
    124 		} else if(str_keyword(&parse, "question")) {
    125 			e->match_question = 1;
    126 		} else if(str_keyword(&parse, "answer")) {
    127 			e->match_answer = 1;
    128 		} else if(str_keyword(&parse, "subdomain")) {
    129 			e->match_subdomain = 1;
    130 		} else if(str_keyword(&parse, "all_noedns")) {
    131 			e->match_all_noedns = 1;
    132 		} else if(str_keyword(&parse, "all")) {
    133 			e->match_all = 1;
    134 		} else if(str_keyword(&parse, "ttl")) {
    135 			e->match_ttl = 1;
    136 		} else if(str_keyword(&parse, "DO")) {
    137 			e->match_do = 1;
    138 		} else if(str_keyword(&parse, "CO")) {
    139 			e->match_co = 1;
    140 		} else if(str_keyword(&parse, "noedns")) {
    141 			e->match_noedns = 1;
    142 		} else if(str_keyword(&parse, "ednsdata")) {
    143 			e->match_ednsdata_raw = 1;
    144 		} else if(str_keyword(&parse, "client_cookie")) {
    145 			e->match_client_cookie = 1;
    146 		} else if(str_keyword(&parse, "server_cookie")) {
    147 			e->match_server_cookie = 1;
    148 		} else if(str_keyword(&parse, "UDP")) {
    149 			e->match_transport = transport_udp;
    150 		} else if(str_keyword(&parse, "TCP")) {
    151 			e->match_transport = transport_tcp;
    152 		} else if(str_keyword(&parse, "serial")) {
    153 			e->match_serial = 1;
    154 			if(*parse != '=' && *parse != ':')
    155 				error("expected = or : in MATCH: %s", line);
    156 			parse++;
    157 			e->ixfr_soa_serial = (uint32_t)strtol(parse, (char**)&parse, 10);
    158 			while(isspace((unsigned char)*parse))
    159 				parse++;
    160 		} else if(str_keyword(&parse, "ede")) {
    161 			e->match_ede = 1;
    162 			if(*parse != '=' && *parse != ':')
    163 				error("expected = or : in MATCH: %s", line);
    164 			parse++;
    165 			while(isspace((unsigned char)*parse))
    166 				parse++;
    167 			if(str_keyword(&parse, "any")) {
    168 				e->match_ede_any = 1;
    169 			} else {
    170 				e->ede_info_code = (uint16_t)strtol(parse,
    171 					(char**)&parse, 10);
    172 			}
    173 			while(isspace((unsigned char)*parse))
    174 				parse++;
    175 		} else {
    176 			error("could not parse MATCH: '%s'", parse);
    177 		}
    178 	}
    179 }
    180 
    181 /** parse REPLY line */
    182 static void replyline(char* line, uint8_t* reply, size_t reply_len,
    183 	int* do_flag, int* co_flag)
    184 {
    185 	char* parse = line;
    186 	if(reply_len < LDNS_HEADER_SIZE) error("packet too short for header");
    187 	while(*parse) {
    188 		if(isendline(*parse))
    189 			return;
    190 			/* opcodes */
    191 		if(str_keyword(&parse, "QUERY")) {
    192 			LDNS_OPCODE_SET(reply, LDNS_PACKET_QUERY);
    193 		} else if(str_keyword(&parse, "IQUERY")) {
    194 			LDNS_OPCODE_SET(reply, LDNS_PACKET_IQUERY);
    195 		} else if(str_keyword(&parse, "STATUS")) {
    196 			LDNS_OPCODE_SET(reply, LDNS_PACKET_STATUS);
    197 		} else if(str_keyword(&parse, "NOTIFY")) {
    198 			LDNS_OPCODE_SET(reply, LDNS_PACKET_NOTIFY);
    199 		} else if(str_keyword(&parse, "UPDATE")) {
    200 			LDNS_OPCODE_SET(reply, LDNS_PACKET_UPDATE);
    201 			/* rcodes */
    202 		} else if(str_keyword(&parse, "NOERROR")) {
    203 			LDNS_RCODE_SET(reply, LDNS_RCODE_NOERROR);
    204 		} else if(str_keyword(&parse, "FORMERR")) {
    205 			LDNS_RCODE_SET(reply, LDNS_RCODE_FORMERR);
    206 		} else if(str_keyword(&parse, "SERVFAIL")) {
    207 			LDNS_RCODE_SET(reply, LDNS_RCODE_SERVFAIL);
    208 		} else if(str_keyword(&parse, "NXDOMAIN")) {
    209 			LDNS_RCODE_SET(reply, LDNS_RCODE_NXDOMAIN);
    210 		} else if(str_keyword(&parse, "NOTIMPL")) {
    211 			LDNS_RCODE_SET(reply, LDNS_RCODE_NOTIMPL);
    212 		} else if(str_keyword(&parse, "REFUSED")) {
    213 			LDNS_RCODE_SET(reply, LDNS_RCODE_REFUSED);
    214 		} else if(str_keyword(&parse, "YXDOMAIN")) {
    215 			LDNS_RCODE_SET(reply, LDNS_RCODE_YXDOMAIN);
    216 		} else if(str_keyword(&parse, "YXRRSET")) {
    217 			LDNS_RCODE_SET(reply, LDNS_RCODE_YXRRSET);
    218 		} else if(str_keyword(&parse, "NXRRSET")) {
    219 			LDNS_RCODE_SET(reply, LDNS_RCODE_NXRRSET);
    220 		} else if(str_keyword(&parse, "NOTAUTH")) {
    221 			LDNS_RCODE_SET(reply, LDNS_RCODE_NOTAUTH);
    222 		} else if(str_keyword(&parse, "NOTZONE")) {
    223 			LDNS_RCODE_SET(reply, LDNS_RCODE_NOTZONE);
    224 			/* flags */
    225 		} else if(str_keyword(&parse, "QR")) {
    226 			LDNS_QR_SET(reply);
    227 		} else if(str_keyword(&parse, "AA")) {
    228 			LDNS_AA_SET(reply);
    229 		} else if(str_keyword(&parse, "TC")) {
    230 			LDNS_TC_SET(reply);
    231 		} else if(str_keyword(&parse, "RD")) {
    232 			LDNS_RD_SET(reply);
    233 		} else if(str_keyword(&parse, "CD")) {
    234 			LDNS_CD_SET(reply);
    235 		} else if(str_keyword(&parse, "RA")) {
    236 			LDNS_RA_SET(reply);
    237 		} else if(str_keyword(&parse, "AD")) {
    238 			LDNS_AD_SET(reply);
    239 		} else if(str_keyword(&parse, "DO")) {
    240 			*do_flag = 1;
    241 		} else if(str_keyword(&parse, "CO")) {
    242 			*co_flag = 1;
    243 		} else {
    244 			error("could not parse REPLY: '%s'", parse);
    245 		}
    246 	}
    247 }
    248 
    249 /** parse ADJUST line */
    250 static void adjustline(char* line, struct entry* e,
    251 	struct reply_packet* pkt)
    252 {
    253 	char* parse = line;
    254 	while(*parse) {
    255 		if(isendline(*parse))
    256 			return;
    257 		if(str_keyword(&parse, "copy_id")) {
    258 			e->copy_id = 1;
    259 		} else if(str_keyword(&parse, "copy_query")) {
    260 			e->copy_query = 1;
    261 		} else if(str_keyword(&parse, "copy_ednsdata_assume_clientsubnet")) {
    262 			e->copy_ednsdata_assume_clientsubnet = 1;
    263 		} else if(str_keyword(&parse, "increment_ecs_scope")) {
    264 			e->increment_ecs_scope = 1;
    265 		} else if(str_keyword(&parse, "sleep=")) {
    266 			e->sleeptime = (unsigned int) strtol(parse, (char**)&parse, 10);
    267 			while(isspace((unsigned char)*parse))
    268 				parse++;
    269 		} else if(str_keyword(&parse, "packet_sleep=")) {
    270 			pkt->packet_sleep = (unsigned int) strtol(parse, (char**)&parse, 10);
    271 			while(isspace((unsigned char)*parse))
    272 				parse++;
    273 		} else {
    274 			error("could not parse ADJUST: '%s'", parse);
    275 		}
    276 	}
    277 }
    278 
    279 /** create new entry */
    280 static struct entry* new_entry(void)
    281 {
    282 	struct entry* e = (struct entry*)malloc(sizeof(struct entry));
    283 	if(!e) error("out of memory");
    284 	memset(e, 0, sizeof(*e));
    285 	e->match_opcode = 0;
    286 	e->match_qtype = 0;
    287 	e->match_qname = 0;
    288 	e->match_rcode = 0;
    289 	e->match_question = 0;
    290 	e->match_answer = 0;
    291 	e->match_subdomain = 0;
    292 	e->match_all = 0;
    293 	e->match_all_noedns = 0;
    294 	e->match_ttl = 0;
    295 	e->match_do = 0;
    296 	e->match_co = 0;
    297 	e->match_noedns = 0;
    298 	e->match_serial = 0;
    299 	e->ixfr_soa_serial = 0;
    300 	e->match_ede = 0;
    301 	e->match_ede_any = 0;
    302 	e->ede_info_code = -1;
    303 	e->match_transport = transport_any;
    304 	e->reply_list = NULL;
    305 	e->copy_id = 0;
    306 	e->copy_query = 0;
    307 	e->copy_ednsdata_assume_clientsubnet = 0;
    308 	e->increment_ecs_scope = 0;
    309 	e->sleeptime = 0;
    310 	e->next = NULL;
    311 	return e;
    312 }
    313 
    314 /**
    315  * Converts a hex string to binary data
    316  * @param hexstr: string of hex.
    317  * @param len: is the length of the string
    318  * @param buf: is the buffer to store the result in
    319  * @param offset: is the starting position in the result buffer
    320  * @param buf_len: is the length of buf.
    321  * @return This function returns the length of the result
    322  */
    323 static size_t
    324 hexstr2bin(char *hexstr, int len, uint8_t *buf, size_t offset, size_t buf_len)
    325 {
    326 	char c;
    327 	int i;
    328 	uint8_t int8 = 0;
    329 	int sec = 0;
    330 	size_t bufpos = 0;
    331 
    332 	if (len % 2 != 0) {
    333 		return 0;
    334 	}
    335 
    336 	for (i=0; i<len; i++) {
    337 		c = hexstr[i];
    338 
    339 		/* case insensitive, skip spaces */
    340 		if (c != ' ') {
    341 			if (c >= '0' && c <= '9') {
    342 				int8 += c & 0x0f;
    343 			} else if (c >= 'a' && c <= 'z') {
    344 				int8 += (c & 0x0f) + 9;
    345 			} else if (c >= 'A' && c <= 'Z') {
    346 				int8 += (c & 0x0f) + 9;
    347 			} else {
    348 				return 0;
    349 			}
    350 
    351 			if (sec == 0) {
    352 				int8 = int8 << 4;
    353 				sec = 1;
    354 			} else {
    355 				if (bufpos + offset + 1 <= buf_len) {
    356 					buf[bufpos+offset] = int8;
    357 					int8 = 0;
    358 					sec = 0;
    359 					bufpos++;
    360 				} else {
    361 					fprintf(stderr, "Buffer too small in hexstr2bin");
    362 				}
    363 			}
    364 		}
    365         }
    366         return bufpos;
    367 }
    368 
    369 /** convert hex buffer to binary buffer */
    370 static sldns_buffer *
    371 hex_buffer2wire(sldns_buffer *data_buffer)
    372 {
    373 	sldns_buffer *wire_buffer = NULL;
    374 	int c;
    375 
    376 	/* stat hack
    377 	 * 0 = normal
    378 	 * 1 = comment (skip to end of line)
    379 	 * 2 = unprintable character found, read binary data directly
    380 	 */
    381 	size_t data_buf_pos = 0;
    382 	int state = 0;
    383 	uint8_t *hexbuf;
    384 	int hexbufpos = 0;
    385 	size_t wirelen;
    386 	uint8_t *data_wire = (uint8_t *) sldns_buffer_begin(data_buffer);
    387 	uint8_t *wire = (uint8_t*)malloc(MAX_PACKETLEN);
    388 	if(!wire) error("out of memory");
    389 
    390 	hexbuf = (uint8_t*)malloc(MAX_PACKETLEN);
    391 	if(!hexbuf) error("out of memory");
    392 	for (data_buf_pos = 0; data_buf_pos < sldns_buffer_position(data_buffer); data_buf_pos++) {
    393 		c = (int) data_wire[data_buf_pos];
    394 
    395 		if (state < 2 && !isascii((unsigned char)c)) {
    396 			/*verbose("non ascii character found in file: (%d) switching to raw mode\n", c);*/
    397 			state = 2;
    398 		}
    399 		switch (state) {
    400 			case 0:
    401 				if (	(c >= '0' && c <= '9') ||
    402 					(c >= 'a' && c <= 'f') ||
    403 					(c >= 'A' && c <= 'F') )
    404 				{
    405 					if (hexbufpos >= MAX_PACKETLEN) {
    406 						error("buffer overflow");
    407 						free(hexbuf);
    408 						return 0;
    409 
    410 					}
    411 					hexbuf[hexbufpos] = (uint8_t) c;
    412 					hexbufpos++;
    413 				} else if (c == ';') {
    414 					state = 1;
    415 				} else if (c == ' ' || c == '\t' || c == '\n') {
    416 					/* skip whitespace */
    417 				}
    418 				break;
    419 			case 1:
    420 				if (c == '\n' || c == EOF) {
    421 					state = 0;
    422 				}
    423 				break;
    424 			case 2:
    425 				if (hexbufpos >= MAX_PACKETLEN) {
    426 					error("buffer overflow");
    427 					free(hexbuf);
    428 					return 0;
    429 				}
    430 				hexbuf[hexbufpos] = (uint8_t) c;
    431 				hexbufpos++;
    432 				break;
    433 		}
    434 	}
    435 
    436 	if (hexbufpos >= MAX_PACKETLEN) {
    437 		/*verbose("packet size reached\n");*/
    438 	}
    439 
    440 	/* lenient mode: length must be multiple of 2 */
    441 	if (hexbufpos % 2 != 0) {
    442 		if (hexbufpos >= MAX_PACKETLEN) {
    443 			error("buffer overflow");
    444 			free(hexbuf);
    445 			return 0;
    446 		}
    447 		hexbuf[hexbufpos] = (uint8_t) '0';
    448 		hexbufpos++;
    449 	}
    450 
    451 	if (state < 2) {
    452 		wirelen = hexstr2bin((char *) hexbuf, hexbufpos, wire, 0, MAX_PACKETLEN);
    453 		wire_buffer = sldns_buffer_new(wirelen);
    454 		sldns_buffer_new_frm_data(wire_buffer, wire, wirelen);
    455 	} else {
    456 		error("Incomplete hex data, not at byte boundary\n");
    457 	}
    458 	free(wire);
    459 	free(hexbuf);
    460 	return wire_buffer;
    461 }
    462 
    463 /** parse ORIGIN */
    464 static void
    465 get_origin(const char* name, struct sldns_file_parse_state* pstate, char* parse)
    466 {
    467 	/* snip off rest of the text so as to make the parse work in ldns */
    468 	char* end;
    469 	char store;
    470 	int status;
    471 
    472 	end=parse;
    473 	while(!isspace((unsigned char)*end) && !isendline(*end))
    474 		end++;
    475 	store = *end;
    476 	*end = 0;
    477 	verbose(3, "parsing '%s'\n", parse);
    478 	pstate->origin_len = sizeof(pstate->origin);
    479 	status = sldns_str2wire_dname_buf(parse, pstate->origin,
    480 		&pstate->origin_len);
    481 	*end = store;
    482 	if(status != 0)
    483 		error("%s line %d:\n\t%s: %s", name, pstate->lineno,
    484 			sldns_get_errorstr_parse(status), parse);
    485 }
    486 
    487 /** add RR to packet */
    488 static void add_rr(char* rrstr, uint8_t* pktbuf, size_t pktsize,
    489 	size_t* pktlen, struct sldns_file_parse_state* pstate,
    490 	sldns_pkt_section add_section, const char* fname)
    491 {
    492 	/* it must be a RR, parse and add to packet. */
    493 	size_t rr_len = pktsize - *pktlen;
    494 	size_t dname_len = 0;
    495 	int status;
    496 	uint8_t* origin = pstate->origin_len?pstate->origin:0;
    497 	uint8_t* prev = pstate->prev_rr_len?pstate->prev_rr:0;
    498 	if(*pktlen > pktsize || *pktlen < LDNS_HEADER_SIZE)
    499 		error("packet overflow");
    500 
    501 	/* parse RR */
    502 	if(add_section == LDNS_SECTION_QUESTION)
    503 		status = sldns_str2wire_rr_question_buf(rrstr, pktbuf+*pktlen,
    504 			&rr_len, &dname_len, origin, pstate->origin_len,
    505 			prev, pstate->prev_rr_len);
    506 	else status = sldns_str2wire_rr_buf(rrstr, pktbuf+*pktlen, &rr_len,
    507 			&dname_len, pstate->default_ttl, origin,
    508 			pstate->origin_len, prev, pstate->prev_rr_len);
    509 	if(status != 0)
    510 		error("%s line %d:%d %s\n\t%s", fname, pstate->lineno,
    511 			LDNS_WIREPARSE_OFFSET(status),
    512 			sldns_get_errorstr_parse(status), rrstr);
    513 	*pktlen += rr_len;
    514 
    515 	/* increase RR count */
    516 	if(add_section == LDNS_SECTION_QUESTION)
    517 		sldns_write_uint16(pktbuf+4, LDNS_QDCOUNT(pktbuf)+1);
    518 	else if(add_section == LDNS_SECTION_ANSWER)
    519 		sldns_write_uint16(pktbuf+6, LDNS_ANCOUNT(pktbuf)+1);
    520 	else if(add_section == LDNS_SECTION_AUTHORITY)
    521 		sldns_write_uint16(pktbuf+8, LDNS_NSCOUNT(pktbuf)+1);
    522 	else if(add_section == LDNS_SECTION_ADDITIONAL)
    523 		sldns_write_uint16(pktbuf+10, LDNS_ARCOUNT(pktbuf)+1);
    524 	else error("internal error bad section %d", (int)add_section);
    525 }
    526 
    527 /* add EDNS 4096 opt record */
    528 static void
    529 add_edns(uint8_t* pktbuf, size_t pktsize, int do_flag, int co_flag,
    530 	uint8_t *ednsdata, uint16_t ednslen, size_t* pktlen)
    531 {
    532 	uint8_t edns[] = {0x00, /* root label */
    533 		0x00, LDNS_RR_TYPE_OPT, /* type */
    534 		0x04, 0xD0, /* class is UDPSIZE 1232 */
    535 		0x00, /* TTL[0] is ext rcode */
    536 		0x00, /* TTL[1] is edns version */
    537 		(uint8_t)(do_flag?0x80:0x00)
    538 		| (uint8_t)(co_flag?0x40:0x00)
    539 		, 0x00, /* TTL[2-3] is edns flags, DO */
    540 		(uint8_t)((ednslen >> 8) & 0xff),
    541 		(uint8_t)(ednslen  & 0xff), /* rdatalength */
    542 	};
    543 	if(*pktlen < LDNS_HEADER_SIZE)
    544 		return;
    545 	if(*pktlen + sizeof(edns) + ednslen > pktsize)
    546 		error("not enough space for EDNS OPT record");
    547 	memmove(pktbuf+*pktlen, edns, sizeof(edns));
    548 	if(ednsdata && ednslen)
    549 		memmove(pktbuf+*pktlen+sizeof(edns), ednsdata, ednslen);
    550 	sldns_write_uint16(pktbuf+10, LDNS_ARCOUNT(pktbuf)+1);
    551 	*pktlen += (sizeof(edns) + ednslen);
    552 }
    553 
    554 /* Reads one entry from file. Returns entry or NULL on error. */
    555 struct entry*
    556 read_entry(FILE* in, const char* name, struct sldns_file_parse_state* pstate,
    557 	int skip_whitespace)
    558 {
    559 	struct entry* current = NULL;
    560 	char line[MAX_LINE];
    561 	char* parse;
    562 	sldns_pkt_section add_section = LDNS_SECTION_QUESTION;
    563 	struct reply_packet *cur_reply = NULL;
    564 	int reading_hex = 0;
    565 	int reading_hex_ednsdata = 0;
    566 	sldns_buffer* hex_data_buffer = NULL;
    567 	sldns_buffer* hex_ednsdata_buffer = NULL;
    568 	uint8_t pktbuf[MAX_PACKETLEN];
    569 	size_t pktlen = LDNS_HEADER_SIZE;
    570 	int do_flag = 0; /* DO flag in EDNS */
    571 	int co_flag = 0; /* CO flag in EDNS */
    572 	memset(pktbuf, 0, pktlen); /* ID = 0, FLAGS="", and rr counts 0 */
    573 
    574 	while(fgets(line, (int)sizeof(line), in) != NULL) {
    575 		line[MAX_LINE-1] = 0;
    576 		parse = line;
    577 		pstate->lineno++;
    578 
    579 		while(isspace((unsigned char)*parse))
    580 			parse++;
    581 		/* test for keywords */
    582 		if(isendline(*parse))
    583 			continue; /* skip comment and empty lines */
    584 		if(str_keyword(&parse, "ENTRY_BEGIN")) {
    585 			if(current) {
    586 				error("%s line %d: previous entry does not ENTRY_END",
    587 					name, pstate->lineno);
    588 			}
    589 			current = new_entry();
    590 			current->lineno = pstate->lineno;
    591 			cur_reply = entry_add_reply(current);
    592 			continue;
    593 		} else if(str_keyword(&parse, "$ORIGIN")) {
    594 			get_origin(name, pstate, parse);
    595 			continue;
    596 		} else if(str_keyword(&parse, "$TTL")) {
    597 			pstate->default_ttl = (uint32_t)atoi(parse);
    598 			continue;
    599 		}
    600 
    601 		/* working inside an entry */
    602 		if(!current) {
    603 			error("%s line %d: expected ENTRY_BEGIN but got %s",
    604 				name, pstate->lineno, line);
    605 		}
    606 		if(str_keyword(&parse, "MATCH")) {
    607 			matchline(parse, current);
    608 		} else if(str_keyword(&parse, "REPLY")) {
    609 			replyline(parse, pktbuf, pktlen, &do_flag, &co_flag);
    610 		} else if(str_keyword(&parse, "ADJUST")) {
    611 			adjustline(parse, current, cur_reply);
    612 		} else if(str_keyword(&parse, "EXTRA_PACKET")) {
    613 			/* copy current packet into buffer */
    614 			cur_reply->reply_pkt = memdup(pktbuf, pktlen);
    615 			cur_reply->reply_len = pktlen;
    616 			if(!cur_reply->reply_pkt)
    617 				error("out of memory");
    618 			cur_reply = entry_add_reply(current);
    619 			/* clear for next packet */
    620 			pktlen = LDNS_HEADER_SIZE;
    621 			memset(pktbuf, 0, pktlen); /* ID = 0, FLAGS="", and rr counts 0 */
    622 		} else if(str_keyword(&parse, "SECTION")) {
    623 			if(str_keyword(&parse, "QUESTION"))
    624 				add_section = LDNS_SECTION_QUESTION;
    625 			else if(str_keyword(&parse, "ANSWER"))
    626 				add_section = LDNS_SECTION_ANSWER;
    627 			else if(str_keyword(&parse, "AUTHORITY"))
    628 				add_section = LDNS_SECTION_AUTHORITY;
    629 			else if(str_keyword(&parse, "ADDITIONAL"))
    630 				add_section = LDNS_SECTION_ADDITIONAL;
    631 			else error("%s line %d: bad section %s", name, pstate->lineno, parse);
    632 		} else if(str_keyword(&parse, "HEX_ANSWER_BEGIN")) {
    633 			hex_data_buffer = sldns_buffer_new(MAX_PACKETLEN);
    634 			reading_hex = 1;
    635 		} else if(str_keyword(&parse, "HEX_ANSWER_END")) {
    636 			if(!reading_hex) {
    637 				error("%s line %d: HEX_ANSWER_END read but no HEX_ANSWER_BEGIN keyword seen", name, pstate->lineno);
    638 			}
    639 			reading_hex = 0;
    640 			cur_reply->reply_from_hex = hex_buffer2wire(hex_data_buffer);
    641 			sldns_buffer_free(hex_data_buffer);
    642 			hex_data_buffer = NULL;
    643 		} else if(reading_hex) {
    644 			sldns_buffer_printf(hex_data_buffer, "%s", line);
    645 		} else if(str_keyword(&parse, "HEX_EDNSDATA_BEGIN")) {
    646 			hex_ednsdata_buffer = sldns_buffer_new(MAX_PACKETLEN);
    647 			reading_hex_ednsdata = 1;
    648 		} else if(str_keyword(&parse, "HEX_EDNSDATA_END")) {
    649 			if (!reading_hex_ednsdata) {
    650 				error("%s line %d: HEX_EDNSDATA_END read but no"
    651 					"HEX_EDNSDATA_BEGIN keyword seen", name, pstate->lineno);
    652 			}
    653 			reading_hex_ednsdata = 0;
    654 			cur_reply->raw_ednsdata = hex_buffer2wire(hex_ednsdata_buffer);
    655 			sldns_buffer_free(hex_ednsdata_buffer);
    656 			hex_ednsdata_buffer = NULL;
    657 		} else if(reading_hex_ednsdata) {
    658 			sldns_buffer_printf(hex_ednsdata_buffer, "%s", line);
    659 		} else if(str_keyword(&parse, "ENTRY_END")) {
    660 			if(hex_data_buffer)
    661 				sldns_buffer_free(hex_data_buffer);
    662 			if(hex_ednsdata_buffer)
    663 				sldns_buffer_free(hex_ednsdata_buffer);
    664 			if(pktlen != 0) {
    665 				if(do_flag || co_flag
    666 					|| cur_reply->raw_ednsdata) {
    667 					if(cur_reply->raw_ednsdata &&
    668 						sldns_buffer_limit(cur_reply->raw_ednsdata))
    669 						add_edns(pktbuf, sizeof(pktbuf), do_flag, co_flag,
    670 							sldns_buffer_begin(cur_reply->raw_ednsdata),
    671 							(uint16_t)sldns_buffer_limit(cur_reply->raw_ednsdata),
    672 							&pktlen);
    673 					else
    674 						add_edns(pktbuf, sizeof(pktbuf), do_flag, co_flag,
    675 							NULL, 0, &pktlen);
    676 				}
    677 				cur_reply->reply_pkt = memdup(pktbuf, pktlen);
    678 				cur_reply->reply_len = pktlen;
    679 				if(!cur_reply->reply_pkt)
    680 					error("out of memory");
    681 			}
    682 			return current;
    683 		} else {
    684 			add_rr(skip_whitespace?parse:line, pktbuf,
    685 				sizeof(pktbuf), &pktlen, pstate, add_section,
    686 				name);
    687 		}
    688 
    689 	}
    690 	if(reading_hex) {
    691 		error("%s: End of file reached while still reading hex, "
    692 			"missing HEX_ANSWER_END\n", name);
    693 	}
    694 	if(reading_hex_ednsdata) {
    695 		error("%s: End of file reached while still reading edns data, "
    696 			"missing HEX_EDNSDATA_END\n", name);
    697 	}
    698 	if(current) {
    699 		error("%s: End of file reached while reading entry. "
    700 			"missing ENTRY_END\n", name);
    701 	}
    702 	return 0;
    703 }
    704 
    705 /* reads the canned reply file and returns a list of structs */
    706 struct entry*
    707 read_datafile(const char* name, int skip_whitespace)
    708 {
    709 	struct entry* list = NULL;
    710 	struct entry* last = NULL;
    711 	struct entry* current = NULL;
    712 	FILE *in;
    713 	struct sldns_file_parse_state pstate;
    714 	int entry_num = 0;
    715 	memset(&pstate, 0, sizeof(pstate));
    716 
    717 	if((in=fopen(name, "r")) == NULL) {
    718 		error("could not open file %s: %s", name, strerror(errno));
    719 	}
    720 
    721 	while((current = read_entry(in, name, &pstate, skip_whitespace)))
    722 	{
    723 		if(last)
    724 			last->next = current;
    725 		else	list = current;
    726 		last = current;
    727 		entry_num ++;
    728 	}
    729 	verbose(1, "%s: Read %d entries\n", prog_name, entry_num);
    730 
    731 	fclose(in);
    732 	return list;
    733 }
    734 
    735 /** get qtype from packet */
    736 static sldns_rr_type get_qtype(uint8_t* pkt, size_t pktlen)
    737 {
    738 	uint8_t* d;
    739 	size_t dl, sl=0;
    740 	char* snull = NULL;
    741 	int comprloop = 0;
    742 	if(pktlen < LDNS_HEADER_SIZE)
    743 		return 0;
    744 	if(LDNS_QDCOUNT(pkt) == 0)
    745 		return 0;
    746 	/* skip over dname with dname-scan routine */
    747 	d = pkt+LDNS_HEADER_SIZE;
    748 	dl = pktlen-LDNS_HEADER_SIZE;
    749 	(void)sldns_wire2str_dname_scan(&d, &dl, &snull, &sl, pkt, pktlen, &comprloop);
    750 	if(dl < 2)
    751 		return 0;
    752 	return sldns_read_uint16(d);
    753 }
    754 
    755 /** get qtype from packet */
    756 static size_t get_qname_len(uint8_t* pkt, size_t pktlen)
    757 {
    758 	uint8_t* d;
    759 	size_t dl, sl=0;
    760 	char* snull = NULL;
    761 	int comprloop = 0;
    762 	if(pktlen < LDNS_HEADER_SIZE)
    763 		return 0;
    764 	if(LDNS_QDCOUNT(pkt) == 0)
    765 		return 0;
    766 	/* skip over dname with dname-scan routine */
    767 	d = pkt+LDNS_HEADER_SIZE;
    768 	dl = pktlen-LDNS_HEADER_SIZE;
    769 	(void)sldns_wire2str_dname_scan(&d, &dl, &snull, &sl, pkt, pktlen, &comprloop);
    770 	return pktlen-dl-LDNS_HEADER_SIZE;
    771 }
    772 
    773 /** returns owner from packet */
    774 static uint8_t* get_qname(uint8_t* pkt, size_t pktlen)
    775 {
    776 	if(pktlen < LDNS_HEADER_SIZE)
    777 		return NULL;
    778 	if(LDNS_QDCOUNT(pkt) == 0)
    779 		return NULL;
    780 	return pkt+LDNS_HEADER_SIZE;
    781 }
    782 
    783 /** returns opcode from packet */
    784 static int get_opcode(uint8_t* pkt, size_t pktlen)
    785 {
    786 	if(pktlen < LDNS_HEADER_SIZE)
    787 		return 0;
    788 	return (int)LDNS_OPCODE_WIRE(pkt);
    789 }
    790 
    791 /** returns rcode from packet */
    792 static int get_rcode(uint8_t* pkt, size_t pktlen)
    793 {
    794 	if(pktlen < LDNS_HEADER_SIZE)
    795 		return 0;
    796 	return (int)LDNS_RCODE_WIRE(pkt);
    797 }
    798 
    799 /** get authority section SOA serial value */
    800 static uint32_t get_serial(uint8_t* p, size_t plen)
    801 {
    802 	uint8_t* walk = p;
    803 	size_t walk_len = plen, sl=0;
    804 	char* snull = NULL;
    805 	uint16_t i;
    806 	int comprloop = 0;
    807 
    808 	if(walk_len < LDNS_HEADER_SIZE)
    809 		return 0;
    810 	walk += LDNS_HEADER_SIZE;
    811 	walk_len -= LDNS_HEADER_SIZE;
    812 
    813 	/* skip other records with wire2str_scan */
    814 	for(i=0; i < LDNS_QDCOUNT(p); i++)
    815 		(void)sldns_wire2str_rrquestion_scan(&walk, &walk_len,
    816 			&snull, &sl, p, plen, &comprloop);
    817 	for(i=0; i < LDNS_ANCOUNT(p); i++)
    818 		(void)sldns_wire2str_rr_scan(&walk, &walk_len, &snull, &sl,
    819 			p, plen, &comprloop);
    820 
    821 	/* walk through authority section */
    822 	for(i=0; i < LDNS_NSCOUNT(p); i++) {
    823 		/* if this is SOA then get serial, skip compressed dname */
    824 		uint8_t* dstart = walk;
    825 		size_t dlen = walk_len;
    826 		(void)sldns_wire2str_dname_scan(&dstart, &dlen, &snull, &sl,
    827 			p, plen, &comprloop);
    828 		if(dlen >= 2 && sldns_read_uint16(dstart) == LDNS_RR_TYPE_SOA) {
    829 			/* skip type, class, TTL, rdatalen */
    830 			if(dlen < 10)
    831 				return 0;
    832 			if(dlen < 10 + (size_t)sldns_read_uint16(dstart+8))
    833 				return 0;
    834 			dstart += 10;
    835 			dlen -= 10;
    836 			/* check third rdf */
    837 			(void)sldns_wire2str_dname_scan(&dstart, &dlen, &snull,
    838 				&sl, p, plen, &comprloop);
    839 			(void)sldns_wire2str_dname_scan(&dstart, &dlen, &snull,
    840 				&sl, p, plen, &comprloop);
    841 			if(dlen < 4)
    842 				return 0;
    843 			verbose(3, "found serial %u in msg. ",
    844 				(int)sldns_read_uint32(dstart));
    845 			return sldns_read_uint32(dstart);
    846 		}
    847 		/* move to next RR */
    848 		(void)sldns_wire2str_rr_scan(&walk, &walk_len, &snull, &sl,
    849 			p, plen, &comprloop);
    850 	}
    851 	return 0;
    852 }
    853 
    854 /** get ptr to EDNS OPT record (and remaining length); after the type u16 */
    855 static int
    856 pkt_find_edns_opt(uint8_t** p, size_t* plen)
    857 {
    858 	/* walk over the packet with scan routines */
    859 	uint8_t* w = *p;
    860 	size_t wlen = *plen, sl=0;
    861 	char* snull = NULL;
    862 	uint16_t i;
    863 	int comprloop = 0;
    864 
    865 	if(wlen < LDNS_HEADER_SIZE)
    866 		return 0;
    867 	w += LDNS_HEADER_SIZE;
    868 	wlen -= LDNS_HEADER_SIZE;
    869 
    870 	/* skip other records with wire2str_scan */
    871 	for(i=0; i < LDNS_QDCOUNT(*p); i++)
    872 		(void)sldns_wire2str_rrquestion_scan(&w, &wlen, &snull, &sl,
    873 			*p, *plen, &comprloop);
    874 	for(i=0; i < LDNS_ANCOUNT(*p); i++)
    875 		(void)sldns_wire2str_rr_scan(&w, &wlen, &snull, &sl, *p, *plen, &comprloop);
    876 	for(i=0; i < LDNS_NSCOUNT(*p); i++)
    877 		(void)sldns_wire2str_rr_scan(&w, &wlen, &snull, &sl, *p, *plen, &comprloop);
    878 
    879 	/* walk through additional section */
    880 	for(i=0; i < LDNS_ARCOUNT(*p); i++) {
    881 		/* if this is OPT then done */
    882 		uint8_t* dstart = w;
    883 		size_t dlen = wlen;
    884 		(void)sldns_wire2str_dname_scan(&dstart, &dlen, &snull, &sl,
    885 			*p, *plen, &comprloop);
    886 		if(dlen >= 2 && sldns_read_uint16(dstart) == LDNS_RR_TYPE_OPT) {
    887 			*p = dstart+2;
    888 			*plen = dlen-2;
    889 			return 1;
    890 		}
    891 		/* move to next RR */
    892 		(void)sldns_wire2str_rr_scan(&w, &wlen, &snull, &sl, *p, *plen, &comprloop);
    893 	}
    894 	return 0;
    895 }
    896 
    897 /** return true if the packet has EDNS OPT record */
    898 static int
    899 get_has_edns(uint8_t* pkt, size_t len)
    900 {
    901 	/* use arguments as temporary variables */
    902 	return pkt_find_edns_opt(&pkt, &len);
    903 }
    904 
    905 /** return true if the DO flag is set */
    906 static int
    907 get_do_flag(uint8_t* pkt, size_t len)
    908 {
    909 	uint16_t edns_bits;
    910 	uint8_t* walk = pkt;
    911 	size_t walk_len = len;
    912 	if(!pkt_find_edns_opt(&walk, &walk_len)) {
    913 		return 0;
    914 	}
    915 	if(walk_len < 6)
    916 		return 0; /* malformed */
    917 	edns_bits = sldns_read_uint16(walk+4);
    918 	return (int)(edns_bits&LDNS_EDNS_MASK_DO_BIT);
    919 }
    920 
    921 /** return true if the CO flag is set */
    922 static int
    923 get_co_flag(uint8_t* pkt, size_t len)
    924 {
    925 	uint16_t edns_bits;
    926 	uint8_t* walk = pkt;
    927 	size_t walk_len = len;
    928 	if(!pkt_find_edns_opt(&walk, &walk_len)) {
    929 		return 0;
    930 	}
    931 	if(walk_len < 6)
    932 		return 0; /* malformed */
    933 	edns_bits = sldns_read_uint16(walk+4);
    934 	return (int)(edns_bits&LDNS_EDNS_MASK_CO_BIT);
    935 }
    936 
    937 /** Snips the specified EDNS option out of the OPT record and puts it in the
    938  *  provided buffer. The buffer should be able to hold any opt data ie 65535.
    939  *  Returns the length of the option written,
    940  *  or 0 if not found, else -1 on error. */
    941 static int
    942 pkt_snip_edns_option(uint8_t* pkt, size_t len, sldns_edns_option code,
    943 	uint8_t* buf)
    944 {
    945 	uint8_t *rdata, *opt_position = pkt;
    946 	uint16_t rdlen, optlen;
    947 	size_t remaining = len;
    948 	if(!pkt_find_edns_opt(&opt_position, &remaining)) return 0;
    949 	if(remaining < 8) return -1; /* malformed */
    950 	rdlen = sldns_read_uint16(opt_position+6);
    951 	if(remaining < ((size_t)rdlen)+8)
    952 		return -1; /* malformed */
    953 	rdata = opt_position + 8;
    954 	while(rdlen > 0) {
    955 		if(rdlen < 4) return -1; /* malformed */
    956 		optlen = sldns_read_uint16(rdata+2);
    957 		if((size_t)rdlen < 4+((size_t)optlen))
    958 			return -1; /* malformed */
    959 		if(sldns_read_uint16(rdata) == code) {
    960 			/* save data to buf for caller inspection */
    961 			memmove(buf, rdata+4, optlen);
    962 			/* snip option from packet; assumes len is correct */
    963 			memmove(rdata, rdata+4+optlen,
    964 				(pkt+len)-(rdata+4+optlen));
    965 			/* update OPT size */
    966 			sldns_write_uint16(opt_position+6,
    967 				sldns_read_uint16(opt_position+6)-(4+optlen));
    968 			return optlen;
    969 		}
    970 		rdlen -= 4 + optlen;
    971 		rdata += 4 + optlen;
    972 	}
    973 	return 0;
    974 }
    975 
    976 /** Snips the EDE option out of the OPT record and returns the EDNS EDE
    977  *  INFO-CODE if found, else -1 */
    978 static int
    979 extract_ede(uint8_t* pkt, size_t len)
    980 {
    981 	uint8_t buf[65535];
    982 	int buflen = pkt_snip_edns_option(pkt, len, LDNS_EDNS_EDE, buf);
    983 	if(buflen < 2 /*ede without text at minimum*/) return -1;
    984 	return sldns_read_uint16(buf);
    985 }
    986 
    987 /** Snips the DNS Cookie option out of the OPT record and puts it in the
    988  *  provided cookie buffer (should be at least 24 octets).
    989  *  Returns the length of the cookie if found, else -1. */
    990 static int
    991 extract_cookie(uint8_t* pkt, size_t len, uint8_t* cookie)
    992 {
    993 	uint8_t buf[65535];
    994 	int buflen = pkt_snip_edns_option(pkt, len, LDNS_EDNS_COOKIE, buf);
    995 	if(buflen != 8 /*client cookie*/ &&
    996 		buflen != 8 + 16 /*server cookie*/) return -1;
    997 	memcpy(cookie, buf, buflen);
    998 	return buflen;
    999 }
   1000 
   1001 /** zero TTLs in packet */
   1002 static void
   1003 zerottls(uint8_t* pkt, size_t pktlen)
   1004 {
   1005 	uint8_t* walk = pkt;
   1006 	size_t walk_len = pktlen, sl=0;
   1007 	char* snull = NULL;
   1008 	uint16_t i;
   1009 	uint16_t num = LDNS_ANCOUNT(pkt)+LDNS_NSCOUNT(pkt)+LDNS_ARCOUNT(pkt);
   1010 	int comprloop = 0;
   1011 	if(walk_len < LDNS_HEADER_SIZE)
   1012 		return;
   1013 	walk += LDNS_HEADER_SIZE;
   1014 	walk_len -= LDNS_HEADER_SIZE;
   1015 	for(i=0; i < LDNS_QDCOUNT(pkt); i++)
   1016 		(void)sldns_wire2str_rrquestion_scan(&walk, &walk_len,
   1017 			&snull, &sl, pkt, pktlen, &comprloop);
   1018 	for(i=0; i < num; i++) {
   1019 		/* wipe TTL */
   1020 		uint8_t* dstart = walk;
   1021 		size_t dlen = walk_len;
   1022 		(void)sldns_wire2str_dname_scan(&dstart, &dlen, &snull, &sl,
   1023 			pkt, pktlen, &comprloop);
   1024 		if(dlen < 8)
   1025 			return;
   1026 		sldns_write_uint32(dstart+4, 0);
   1027 		/* go to next RR */
   1028 		(void)sldns_wire2str_rr_scan(&walk, &walk_len, &snull, &sl,
   1029 			pkt, pktlen, &comprloop);
   1030 	}
   1031 }
   1032 
   1033 /** get one line (\n) from a string, move next to after the \n, zero \n */
   1034 static int
   1035 get_line(char** s, char** n)
   1036 {
   1037 	/* at end of string? end */
   1038 	if(*n == NULL || **n == 0)
   1039 		return 0;
   1040 	/* result starts at next string */
   1041 	*s = *n;
   1042 	/* find \n after that */
   1043 	*n = strchr(*s, '\n');
   1044 	if(*n && **n != 0) {
   1045 		/* terminate line */
   1046 		(*n)[0] = 0;
   1047 		(*n)++;
   1048 	}
   1049 	return 1;
   1050 }
   1051 
   1052 /** match two RR sections without ordering */
   1053 static int
   1054 match_noloc_section(char** q, char** nq, char** p, char** np, uint16_t num)
   1055 {
   1056 	/* for max number of RRs in packet */
   1057 	const uint16_t numarray = 3000;
   1058 	char* qlines[numarray], *plines[numarray];
   1059 	uint16_t i, j, numq=0, nump=0;
   1060 	if(num > numarray) fatal_exit("too many RRs");
   1061 	/* gather lines */
   1062 	for(i=0; i<num; i++) {
   1063 		get_line(q, nq);
   1064 		get_line(p, np);
   1065 		qlines[numq++] = *q;
   1066 		plines[nump++] = *p;
   1067 	}
   1068 	/* see if they are all present in the other */
   1069 	for(i=0; i<num; i++) {
   1070 		int found = 0;
   1071 		for(j=0; j<num; j++) {
   1072 			if(strcmp(qlines[i], plines[j]) == 0) {
   1073 				found = 1;
   1074 				break;
   1075 			}
   1076 		}
   1077 		if(!found) {
   1078 			verbose(3, "comparenoloc: failed for %s", qlines[i]);
   1079 			return 0;
   1080 		}
   1081 	}
   1082 	return 1;
   1083 }
   1084 
   1085 /** match two strings for unordered equality of RRs and everything else */
   1086 static int
   1087 match_noloc(char* q, char* p, uint8_t* q_pkt, size_t q_pkt_len,
   1088 	uint8_t* p_pkt, size_t p_pkt_len)
   1089 {
   1090 	char* nq = q, *np = p;
   1091 	/* if no header, compare bytes */
   1092 	if(p_pkt_len < LDNS_HEADER_SIZE || q_pkt_len < LDNS_HEADER_SIZE) {
   1093 		if(p_pkt_len != q_pkt_len) return 0;
   1094 		return memcmp(p, q, p_pkt_len);
   1095 	}
   1096 	/* compare RR counts */
   1097 	if(LDNS_QDCOUNT(p_pkt) != LDNS_QDCOUNT(q_pkt))
   1098 		return 0;
   1099 	if(LDNS_ANCOUNT(p_pkt) != LDNS_ANCOUNT(q_pkt))
   1100 		return 0;
   1101 	if(LDNS_NSCOUNT(p_pkt) != LDNS_NSCOUNT(q_pkt))
   1102 		return 0;
   1103 	if(LDNS_ARCOUNT(p_pkt) != LDNS_ARCOUNT(q_pkt))
   1104 		return 0;
   1105 	/* get a line from both; compare; at sections do section */
   1106 	get_line(&q, &nq);
   1107 	get_line(&p, &np);
   1108 	if(strcmp(q, p) != 0) {
   1109 		/* header line opcode, rcode, id */
   1110 		return 0;
   1111 	}
   1112 	get_line(&q, &nq);
   1113 	get_line(&p, &np);
   1114 	if(strcmp(q, p) != 0) {
   1115 		/* header flags, rr counts */
   1116 		return 0;
   1117 	}
   1118 	/* ;; QUESTION SECTION */
   1119 	get_line(&q, &nq);
   1120 	get_line(&p, &np);
   1121 	if(strcmp(q, p) != 0) return 0;
   1122 	if(!match_noloc_section(&q, &nq, &p, &np, LDNS_QDCOUNT(p_pkt)))
   1123 		return 0;
   1124 
   1125 	/* empty line and ;; ANSWER SECTION */
   1126 	get_line(&q, &nq);
   1127 	get_line(&p, &np);
   1128 	if(strcmp(q, p) != 0) return 0;
   1129 	get_line(&q, &nq);
   1130 	get_line(&p, &np);
   1131 	if(strcmp(q, p) != 0) return 0;
   1132 	if(!match_noloc_section(&q, &nq, &p, &np, LDNS_ANCOUNT(p_pkt)))
   1133 		return 0;
   1134 
   1135 	/* empty line and ;; AUTHORITY SECTION */
   1136 	get_line(&q, &nq);
   1137 	get_line(&p, &np);
   1138 	if(strcmp(q, p) != 0) return 0;
   1139 	get_line(&q, &nq);
   1140 	get_line(&p, &np);
   1141 	if(strcmp(q, p) != 0) return 0;
   1142 	if(!match_noloc_section(&q, &nq, &p, &np, LDNS_NSCOUNT(p_pkt)))
   1143 		return 0;
   1144 
   1145 	/* empty line and ;; ADDITIONAL SECTION */
   1146 	get_line(&q, &nq);
   1147 	get_line(&p, &np);
   1148 	if(strcmp(q, p) != 0) return 0;
   1149 	get_line(&q, &nq);
   1150 	get_line(&p, &np);
   1151 	if(strcmp(q, p) != 0) return 0;
   1152 	if(!match_noloc_section(&q, &nq, &p, &np, LDNS_ARCOUNT(p_pkt)))
   1153 		return 0;
   1154 
   1155 	return 1;
   1156 }
   1157 
   1158 /** lowercase domain name - does not follow compression pointers */
   1159 static void lowercase_dname(uint8_t** p, size_t* remain)
   1160 {
   1161 	unsigned i, llen;
   1162 	if(*remain == 0) return;
   1163 	while(**p != 0) {
   1164 		/* compressed? */
   1165 		if((**p & 0xc0) == 0xc0) {
   1166 			llen = *remain < 2 ? (unsigned int)*remain : 2;
   1167 			*p += llen;
   1168 			*remain -= llen;
   1169 			return;
   1170 		}
   1171 		llen = (unsigned int)**p;
   1172 		*p += 1;
   1173 		*remain -= 1;
   1174 		if(*remain < llen)
   1175 			llen = (unsigned int)*remain;
   1176 		for(i=0; i<llen; i++) {
   1177 			(*p)[i] = (uint8_t)tolower((int)(*p)[i]);
   1178 		}
   1179 		*p += llen;
   1180 		*remain -= llen;
   1181 		if(*remain == 0) return;
   1182 	}
   1183 	/* skip root label */
   1184 	*p += 1;
   1185 	*remain -= 1;
   1186 }
   1187 
   1188 /** lowercase rdata of type */
   1189 static void lowercase_rdata(uint8_t** p, size_t* remain,
   1190 	uint16_t rdatalen, uint16_t t)
   1191 {
   1192 	const sldns_rr_descriptor *desc = sldns_rr_descript(t);
   1193 	uint8_t dname_count = 0;
   1194 	size_t i = 0;
   1195 	size_t rdataremain = rdatalen;
   1196 	if(!desc) {
   1197 		/* unknown type */
   1198 		*p += rdatalen;
   1199 		*remain -= rdatalen;
   1200 		return;
   1201 	}
   1202 	while(dname_count < desc->_dname_count) {
   1203 		sldns_rdf_type f = sldns_rr_descriptor_field_type(desc, i++);
   1204 		if(f == LDNS_RDF_TYPE_DNAME) {
   1205 			lowercase_dname(p, &rdataremain);
   1206 			dname_count++;
   1207 		} else if(f == LDNS_RDF_TYPE_STR) {
   1208 			uint8_t len;
   1209 			if(rdataremain == 0) return;
   1210 			len = **p;
   1211 			if(rdataremain < ((size_t)len)+1) {
   1212 				/* malformed LDNS_RDF_TYPE_STR, skip remainder */
   1213 				*p += rdataremain;
   1214 				*remain -= rdatalen;
   1215 				return;
   1216 			}
   1217 			*p += len+1;
   1218 			rdataremain -= len+1;
   1219 		} else {
   1220 			int len = 0;
   1221 			switch(f) {
   1222 			case LDNS_RDF_TYPE_CLASS:
   1223 			case LDNS_RDF_TYPE_ALG:
   1224 			case LDNS_RDF_TYPE_INT8:
   1225 				len = 1;
   1226 				break;
   1227 			case LDNS_RDF_TYPE_INT16:
   1228 			case LDNS_RDF_TYPE_TYPE:
   1229 			case LDNS_RDF_TYPE_CERT_ALG:
   1230 				len = 2;
   1231 				break;
   1232 			case LDNS_RDF_TYPE_INT32:
   1233 			case LDNS_RDF_TYPE_TIME:
   1234 			case LDNS_RDF_TYPE_A:
   1235 			case LDNS_RDF_TYPE_PERIOD:
   1236 				len = 4;
   1237 				break;
   1238 			case LDNS_RDF_TYPE_TSIGTIME:
   1239 				len = 6;
   1240 				break;
   1241 			case LDNS_RDF_TYPE_AAAA:
   1242 				len = 16;
   1243 				break;
   1244 			default: error("bad rdf type in lowercase %d", (int)f);
   1245 			}
   1246 			if (rdataremain < (size_t)len) {
   1247 				/* malformed RDF, skip remainder */
   1248 				*p += rdataremain;
   1249 				*remain -= rdatalen;
   1250 				return;
   1251 			}
   1252 			*p += len;
   1253 			rdataremain -= len;
   1254 		}
   1255 	}
   1256 	/* skip remainder of rdata */
   1257 	*p += rdataremain;
   1258 	*remain -= rdatalen;
   1259 }
   1260 
   1261 /** lowercase all names in the message */
   1262 static void lowercase_pkt(uint8_t* pkt, size_t pktlen)
   1263 {
   1264 	uint16_t i;
   1265 	uint8_t* p = pkt;
   1266 	size_t remain = pktlen;
   1267 	uint16_t t, rdatalen;
   1268 	if(pktlen < LDNS_HEADER_SIZE)
   1269 		return;
   1270 	p += LDNS_HEADER_SIZE;
   1271 	remain -= LDNS_HEADER_SIZE;
   1272 	for(i=0; i<LDNS_QDCOUNT(pkt); i++) {
   1273 		lowercase_dname(&p, &remain);
   1274 		if(remain < 4) return;
   1275 		p += 4;
   1276 		remain -= 4;
   1277 	}
   1278 	for(i=0; i<LDNS_ANCOUNT(pkt)+LDNS_NSCOUNT(pkt)+LDNS_ARCOUNT(pkt); i++) {
   1279 		lowercase_dname(&p, &remain);
   1280 		if(remain < 10) return;
   1281 		t = sldns_read_uint16(p);
   1282 		rdatalen = sldns_read_uint16(p+8);
   1283 		p += 10;
   1284 		remain -= 10;
   1285 		if(remain < rdatalen) return;
   1286 		lowercase_rdata(&p, &remain, rdatalen, t);
   1287 	}
   1288 }
   1289 
   1290 /** match question section of packet */
   1291 static int
   1292 match_question(uint8_t* q, size_t qlen, uint8_t* p, size_t plen, int mttl)
   1293 {
   1294 	char* qstr, *pstr, *s, *qcmpstr, *pcmpstr;
   1295 	uint8_t* qb = q, *pb = p;
   1296 	int r;
   1297 	/* zero TTLs */
   1298 	qb = memdup(q, qlen);
   1299 	pb = memdup(p, plen);
   1300 	if(!qb || !pb) error("out of memory");
   1301 	if(!mttl) {
   1302 		zerottls(qb, qlen);
   1303 		zerottls(pb, plen);
   1304 	}
   1305 	lowercase_pkt(qb, qlen);
   1306 	lowercase_pkt(pb, plen);
   1307 	qstr = sldns_wire2str_pkt(qb, qlen);
   1308 	pstr = sldns_wire2str_pkt(pb, plen);
   1309 	if(!qstr || !pstr) error("cannot pkt2string");
   1310 
   1311 	/* remove before ;; QUESTION */
   1312 	s = strstr(qstr, ";; QUESTION SECTION");
   1313 	qcmpstr = s;
   1314 	s = strstr(pstr, ";; QUESTION SECTION");
   1315 	pcmpstr = s;
   1316 	if(!qcmpstr && !pcmpstr) {
   1317 		free(qstr);
   1318 		free(pstr);
   1319 		free(qb);
   1320 		free(pb);
   1321 		return 1;
   1322 	}
   1323 	if(!qcmpstr || !pcmpstr) {
   1324 		free(qstr);
   1325 		free(pstr);
   1326 		free(qb);
   1327 		free(pb);
   1328 		return 0;
   1329 	}
   1330 
   1331 	/* remove after answer section, (;; ANS, ;; AUTH, ;; ADD  ..) */
   1332 	s = strstr(qcmpstr, ";; ANSWER SECTION");
   1333 	if(!s) s = strstr(qcmpstr, ";; AUTHORITY SECTION");
   1334 	if(!s) s = strstr(qcmpstr, ";; ADDITIONAL SECTION");
   1335 	if(!s) s = strstr(qcmpstr, ";; MSG SIZE");
   1336 	if(s) *s = 0;
   1337 	s = strstr(pcmpstr, ";; ANSWER SECTION");
   1338 	if(!s) s = strstr(pcmpstr, ";; AUTHORITY SECTION");
   1339 	if(!s) s = strstr(pcmpstr, ";; ADDITIONAL SECTION");
   1340 	if(!s) s = strstr(pcmpstr, ";; MSG SIZE");
   1341 	if(s) *s = 0;
   1342 
   1343 	r = (strcmp(qcmpstr, pcmpstr) == 0);
   1344 
   1345 	if(!r) {
   1346 		verbose(3, "mismatch question section '%s' and '%s'",
   1347 			qcmpstr, pcmpstr);
   1348 	}
   1349 
   1350 	free(qstr);
   1351 	free(pstr);
   1352 	free(qb);
   1353 	free(pb);
   1354 	return r;
   1355 }
   1356 
   1357 /** match answer section of packet */
   1358 static int
   1359 match_answer(uint8_t* q, size_t qlen, uint8_t* p, size_t plen, int mttl)
   1360 {
   1361 	char* qstr, *pstr, *s, *qcmpstr, *pcmpstr;
   1362 	uint8_t* qb = q, *pb = p;
   1363 	int r;
   1364 	/* zero TTLs */
   1365 	qb = memdup(q, qlen);
   1366 	pb = memdup(p, plen);
   1367 	if(!qb || !pb) error("out of memory");
   1368 	if(!mttl) {
   1369 		zerottls(qb, qlen);
   1370 		zerottls(pb, plen);
   1371 	}
   1372 	lowercase_pkt(qb, qlen);
   1373 	lowercase_pkt(pb, plen);
   1374 	qstr = sldns_wire2str_pkt(qb, qlen);
   1375 	pstr = sldns_wire2str_pkt(pb, plen);
   1376 	if(!qstr || !pstr) error("cannot pkt2string");
   1377 
   1378 	/* remove before ;; ANSWER */
   1379 	s = strstr(qstr, ";; ANSWER SECTION");
   1380 	qcmpstr = s;
   1381 	s = strstr(pstr, ";; ANSWER SECTION");
   1382 	pcmpstr = s;
   1383 	if(!qcmpstr && !pcmpstr) {
   1384 		free(qstr);
   1385 		free(pstr);
   1386 		free(qb);
   1387 		free(pb);
   1388 		return 1;
   1389 	}
   1390 	if(!qcmpstr || !pcmpstr) {
   1391 		free(qstr);
   1392 		free(pstr);
   1393 		free(qb);
   1394 		free(pb);
   1395 		return 0;
   1396 	}
   1397 
   1398 	/* remove after answer section, (;; AUTH, ;; ADD, ;; MSG size ..) */
   1399 	s = strstr(qcmpstr, ";; AUTHORITY SECTION");
   1400 	if(!s) s = strstr(qcmpstr, ";; ADDITIONAL SECTION");
   1401 	if(!s) s = strstr(qcmpstr, ";; MSG SIZE");
   1402 	if(s) *s = 0;
   1403 	s = strstr(pcmpstr, ";; AUTHORITY SECTION");
   1404 	if(!s) s = strstr(pcmpstr, ";; ADDITIONAL SECTION");
   1405 	if(!s) s = strstr(pcmpstr, ";; MSG SIZE");
   1406 	if(s) *s = 0;
   1407 
   1408 	r = (strcmp(qcmpstr, pcmpstr) == 0);
   1409 
   1410 	if(!r) {
   1411 		verbose(3, "mismatch answer section '%s' and '%s'",
   1412 			qcmpstr, pcmpstr);
   1413 	}
   1414 
   1415 	free(qstr);
   1416 	free(pstr);
   1417 	free(qb);
   1418 	free(pb);
   1419 	return r;
   1420 }
   1421 
   1422 /** ignore EDNS lines in the string by overwriting them with what's left or
   1423  *  zero out if at end of the string */
   1424 static int
   1425 ignore_edns_lines(char* str) {
   1426 	char* edns = str, *n;
   1427 	size_t str_len = strlen(str);
   1428 	while((edns = strstr(edns, "; EDNS"))) {
   1429 		n = strchr(edns, '\n');
   1430 		if(!n) {
   1431 			/* EDNS at end of string; zero */
   1432 			*edns = 0;
   1433 			break;
   1434 		}
   1435 		memmove(edns, n+1, str_len-(n-str));
   1436 	}
   1437 	return 1;
   1438 }
   1439 
   1440 /** match all of the packet */
   1441 int
   1442 match_all(uint8_t* q, size_t qlen, uint8_t* p, size_t plen, int mttl,
   1443 	int noloc, int noedns)
   1444 {
   1445 	char* qstr, *pstr;
   1446 	uint8_t* qb = q, *pb = p;
   1447 	int r;
   1448 	qb = memdup(q, qlen);
   1449 	pb = memdup(p, plen);
   1450 	if(!qb || !pb) error("out of memory");
   1451 	/* zero TTLs */
   1452 	if(!mttl) {
   1453 		zerottls(qb, qlen);
   1454 		zerottls(pb, plen);
   1455 	}
   1456 	lowercase_pkt(qb, qlen);
   1457 	lowercase_pkt(pb, plen);
   1458 	qstr = sldns_wire2str_pkt(qb, qlen);
   1459 	pstr = sldns_wire2str_pkt(pb, plen);
   1460 	if(!qstr || !pstr) error("cannot pkt2string");
   1461 	/* should we ignore EDNS lines? */
   1462 	if(noedns) {
   1463 		ignore_edns_lines(qstr);
   1464 		ignore_edns_lines(pstr);
   1465 	}
   1466 	r = (strcmp(qstr, pstr) == 0);
   1467 	if(!r) {
   1468 		/* remove ;; MSG SIZE (at end of string) */
   1469 		char* s = strstr(qstr, ";; MSG SIZE");
   1470 		if(s) *s=0;
   1471 		s = strstr(pstr, ";; MSG SIZE");
   1472 		if(s) *s=0;
   1473 		r = (strcmp(qstr, pstr) == 0);
   1474 		if(!r && !noloc && !noedns) {
   1475 			/* we are going to fail, see if the cause is EDNS */
   1476 			char* a = strstr(qstr, "; EDNS");
   1477 			char* b = strstr(pstr, "; EDNS");
   1478 			if( (a&&!b) || (b&&!a) ) {
   1479 				verbose(3, "mismatch in EDNS\n");
   1480 			}
   1481 		}
   1482 	}
   1483 	if(!r && noloc) {
   1484 		/* check for reordered sections */
   1485 		r = match_noloc(qstr, pstr, q, qlen, p, plen);
   1486 	}
   1487 	if(!r) {
   1488 		verbose(3, "mismatch pkt '%s' and '%s'", qstr, pstr);
   1489 	}
   1490 	free(qstr);
   1491 	free(pstr);
   1492 	free(qb);
   1493 	free(pb);
   1494 	return r;
   1495 }
   1496 
   1497 /** see if domain names are equal */
   1498 static int equal_dname(uint8_t* q, size_t qlen, uint8_t* p, size_t plen)
   1499 {
   1500 	uint8_t* qn = get_qname(q, qlen);
   1501 	uint8_t* pn = get_qname(p, plen);
   1502 	char qs[512], ps[512];
   1503 	size_t qslen = sizeof(qs), pslen = sizeof(ps);
   1504 	char* qss = qs, *pss = ps;
   1505 	int comprloop = 0;
   1506 	if(!qn || !pn)
   1507 		return 0;
   1508 	(void)sldns_wire2str_dname_scan(&qn, &qlen, &qss, &qslen, q, qlen, &comprloop);
   1509 	(void)sldns_wire2str_dname_scan(&pn, &plen, &pss, &pslen, p, plen, &comprloop);
   1510 	return (strcmp(qs, ps) == 0);
   1511 }
   1512 
   1513 /** see if domain names are subdomain q of p */
   1514 static int subdomain_dname(uint8_t* q, size_t qlen, uint8_t* p, size_t plen)
   1515 {
   1516 	/* we use the tostring routines so as to test unbound's routines
   1517 	 * with something else */
   1518 	uint8_t* qn = get_qname(q, qlen);
   1519 	uint8_t* pn = get_qname(p, plen);
   1520 	char qs[5120], ps[5120];
   1521 	size_t qslen = sizeof(qs), pslen = sizeof(ps);
   1522 	char* qss = qs, *pss = ps;
   1523 	int comprloop = 0;
   1524 	if(!qn || !pn)
   1525 		return 0;
   1526 	/* decompresses domain names */
   1527 	(void)sldns_wire2str_dname_scan(&qn, &qlen, &qss, &qslen, q, qlen, &comprloop);
   1528 	(void)sldns_wire2str_dname_scan(&pn, &plen, &pss, &pslen, p, plen, &comprloop);
   1529 	/* same: false, (strict subdomain check)??? */
   1530 	if(strcmp(qs, ps) == 0)
   1531 		return 1;
   1532 	/* qs must end in ps, at a dot, without \ in front */
   1533 	qslen = strlen(qs);
   1534 	pslen = strlen(ps);
   1535 	if(qslen > pslen && strcmp(qs + (qslen-pslen), ps) == 0 &&
   1536 		qslen + 2 >= pslen && /* space for label and dot */
   1537 		qs[qslen-pslen-1] == '.') {
   1538 		unsigned int slashcount = 0;
   1539 		size_t i = qslen-pslen-2;
   1540 		while(i>0 && qs[i]=='\\') {
   1541 			i++;
   1542 			slashcount++;
   1543 		}
   1544 		if(slashcount%1 == 1) return 0; /* . preceded by \ */
   1545 		return 1;
   1546 	}
   1547 	return 0;
   1548 }
   1549 
   1550 /** Match OPT RDATA (not the EDNS payload size or flags) */
   1551 static int
   1552 match_ednsdata(uint8_t* q, size_t qlen, uint8_t* p, size_t plen)
   1553 {
   1554 	uint8_t* walk_q = q;
   1555 	size_t walk_qlen = qlen;
   1556 	uint8_t* walk_p = p;
   1557 	size_t walk_plen = plen;
   1558 
   1559 	if(!pkt_find_edns_opt(&walk_q, &walk_qlen))
   1560 		walk_qlen = 0;
   1561 	if(!pkt_find_edns_opt(&walk_p, &walk_plen))
   1562 		walk_plen = 0;
   1563 
   1564 	/* class + ttl + rdlen = 8 */
   1565 	if(walk_qlen <= 8 && walk_plen <= 8) {
   1566 		verbose(3, "NO edns opt, move on");
   1567 		return 1;
   1568 	}
   1569 	if(walk_qlen != walk_plen)
   1570 		return 0;
   1571 
   1572 	return (memcmp(walk_p+8, walk_q+8, walk_qlen-8) == 0);
   1573 }
   1574 
   1575 /* finds entry in list, or returns NULL */
   1576 struct entry*
   1577 find_match(struct entry* entries, uint8_t* query_pkt, size_t len,
   1578 	enum transport_type transport)
   1579 {
   1580 	struct entry* p = entries;
   1581 	uint8_t* reply, *query_pkt_orig;
   1582 	size_t rlen, query_pkt_orig_len;
   1583 	/* Keep the original packet; it may be modified */
   1584 	query_pkt_orig = memdup(query_pkt, len);
   1585 	query_pkt_orig_len = len;
   1586 	for(p=entries; p; p=p->next) {
   1587 		verbose(3, "comparepkt: ");
   1588 		reply = p->reply_list->reply_pkt;
   1589 		rlen = p->reply_list->reply_len;
   1590 		/* Restore the original packet for each entry */
   1591 		memcpy(query_pkt, query_pkt_orig, query_pkt_orig_len);
   1592 		/* EDE should be first since it may modify the query_pkt */
   1593 		if(p->match_ede) {
   1594 			int info_code = extract_ede(query_pkt, len);
   1595 			if(info_code == -1) {
   1596 				verbose(3, "bad EDE. Expected but not found\n");
   1597 				continue;
   1598 			} else if(!p->match_ede_any &&
   1599 				(uint16_t)info_code != p->ede_info_code) {
   1600 				verbose(3, "bad EDE INFO-CODE. Expected: %d, "
   1601 					"and got: %d\n", (int)p->ede_info_code,
   1602 					info_code);
   1603 				continue;
   1604 			}
   1605 		}
   1606 		/* Cookies could also modify the query_pkt; keep them early */
   1607 		if(p->match_client_cookie || p->match_server_cookie) {
   1608 			uint8_t cookie[24];
   1609 			int cookie_len = extract_cookie(query_pkt, len,
   1610 				cookie);
   1611 			if(cookie_len == -1) {
   1612 				verbose(3, "bad DNS Cookie. "
   1613 					"Expected but not found\n");
   1614 				continue;
   1615 			} else if(p->match_client_cookie &&
   1616 				cookie_len != 8) {
   1617 				verbose(3, "bad DNS Cookie. Expected client "
   1618 					"cookie of length 8.");
   1619 				continue;
   1620 			} else if((p->match_server_cookie) &&
   1621 				cookie_len != 24) {
   1622 				verbose(3, "bad DNS Cookie. Expected server "
   1623 					"cookie of length 24.");
   1624 				continue;
   1625 			}
   1626 		}
   1627 		if(p->match_opcode && get_opcode(query_pkt, len) !=
   1628 			get_opcode(reply, rlen)) {
   1629 			verbose(3, "bad opcode\n");
   1630 			continue;
   1631 		}
   1632 		if(p->match_qtype && get_qtype(query_pkt, len) !=
   1633 			get_qtype(reply, rlen)) {
   1634 			verbose(3, "bad qtype %d %d\n", get_qtype(query_pkt, len), get_qtype(reply, rlen));
   1635 			continue;
   1636 		}
   1637 		if(p->match_qname) {
   1638 			if(!equal_dname(query_pkt, len, reply, rlen)) {
   1639 				verbose(3, "bad qname\n");
   1640 				continue;
   1641 			}
   1642 		}
   1643 		if(p->match_rcode) {
   1644 			if(get_rcode(query_pkt, len) != get_rcode(reply, rlen)) {
   1645 				char *r1 = sldns_wire2str_rcode(get_rcode(query_pkt, len));
   1646 				char *r2 = sldns_wire2str_rcode(get_rcode(reply, rlen));
   1647 				verbose(3, "bad rcode %s instead of %s\n",
   1648 					r1, r2);
   1649 				free(r1);
   1650 				free(r2);
   1651 				continue;
   1652 			}
   1653 		}
   1654 		if(p->match_question) {
   1655 			if(!match_question(query_pkt, len, reply, rlen,
   1656 				(int)p->match_ttl)) {
   1657 				verbose(3, "bad question section\n");
   1658 				continue;
   1659 			}
   1660 		}
   1661 		if(p->match_answer) {
   1662 			if(!match_answer(query_pkt, len, reply, rlen,
   1663 				(int)p->match_ttl)) {
   1664 				verbose(3, "bad answer section\n");
   1665 				continue;
   1666 			}
   1667 		}
   1668 		if(p->match_subdomain) {
   1669 			if(!subdomain_dname(query_pkt, len, reply, rlen)) {
   1670 				verbose(3, "bad subdomain\n");
   1671 				continue;
   1672 			}
   1673 		}
   1674 		if(p->match_serial && get_serial(query_pkt, len) != p->ixfr_soa_serial) {
   1675 				verbose(3, "bad serial\n");
   1676 				continue;
   1677 		}
   1678 		if(p->match_do && !get_do_flag(query_pkt, len)) {
   1679 			verbose(3, "no DO bit set\n");
   1680 			continue;
   1681 		}
   1682 		if(p->match_co && !get_co_flag(query_pkt, len)) {
   1683 			verbose(3, "no CO bit set\n");
   1684 			continue;
   1685 		}
   1686 		if(p->match_noedns && get_has_edns(query_pkt, len)) {
   1687 			verbose(3, "bad; EDNS OPT present\n");
   1688 			continue;
   1689 		}
   1690 		if(p->match_ednsdata_raw &&
   1691 				!match_ednsdata(query_pkt, len, reply, rlen)) {
   1692 			verbose(3, "bad EDNS data match.\n");
   1693 			continue;
   1694 		}
   1695 		if(p->match_transport != transport_any && p->match_transport != transport) {
   1696 			verbose(3, "bad transport\n");
   1697 			continue;
   1698 		}
   1699 		if(p->match_all_noedns && !match_all(query_pkt, len, reply,
   1700 			rlen, (int)p->match_ttl, 0, 1)) {
   1701 			verbose(3, "bad all_noedns match\n");
   1702 			continue;
   1703 		}
   1704 		if(p->match_all && !match_all(query_pkt, len, reply, rlen,
   1705 			(int)p->match_ttl, 0, 0)) {
   1706 			verbose(3, "bad allmatch\n");
   1707 			continue;
   1708 		}
   1709 		verbose(3, "match!\n");
   1710 		/* Restore the original packet */
   1711 		memcpy(query_pkt, query_pkt_orig, query_pkt_orig_len);
   1712 		free(query_pkt_orig);
   1713 		return p;
   1714 	}
   1715 	/* Restore the original packet */
   1716 	memcpy(query_pkt, query_pkt_orig, query_pkt_orig_len);
   1717 	free(query_pkt_orig);
   1718 	return NULL;
   1719 }
   1720 
   1721 void
   1722 adjust_packet(struct entry* match, uint8_t** answer_pkt, size_t *answer_len,
   1723 	uint8_t* query_pkt, size_t query_len)
   1724 {
   1725 	uint8_t* orig = *answer_pkt;
   1726 	size_t origlen = *answer_len;
   1727 	uint8_t* res;
   1728 	size_t reslen;
   1729 
   1730 	/* perform the copy; if possible; must be uncompressed */
   1731 	if(match->copy_query && origlen >= LDNS_HEADER_SIZE &&
   1732 		query_len >= LDNS_HEADER_SIZE && LDNS_QDCOUNT(query_pkt)!=0
   1733 		&& LDNS_QDCOUNT(orig)==0) {
   1734 		/* no qname in output packet, insert it */
   1735 		size_t dlen = get_qname_len(query_pkt, query_len);
   1736 		reslen = origlen + dlen + 4;
   1737 		res = (uint8_t*)malloc(reslen);
   1738 		if(!res) {
   1739 			verbose(1, "out of memory; send without adjust\n");
   1740 			return;
   1741 		}
   1742 		/* copy the header, query, remainder */
   1743 		memcpy(res, orig, LDNS_HEADER_SIZE);
   1744 		memmove(res+LDNS_HEADER_SIZE, query_pkt+LDNS_HEADER_SIZE,
   1745 			dlen+4);
   1746 		memmove(res+LDNS_HEADER_SIZE+dlen+4, orig+LDNS_HEADER_SIZE,
   1747 			reslen-(LDNS_HEADER_SIZE+dlen+4));
   1748 		/* set QDCOUNT */
   1749 		sldns_write_uint16(res+4, 1);
   1750 	} else if(match->copy_query && origlen >= LDNS_HEADER_SIZE &&
   1751 		query_len >= LDNS_HEADER_SIZE && LDNS_QDCOUNT(query_pkt)!=0
   1752 		&& get_qname_len(orig, origlen) == 0) {
   1753 		/* QDCOUNT(orig)!=0 but qlen == 0, therefore, an error */
   1754 		verbose(1, "error: malformed qname; send without adjust\n");
   1755 		res = memdup(orig, origlen);
   1756 		reslen = origlen;
   1757 	} else if(match->copy_query && origlen >= LDNS_HEADER_SIZE &&
   1758 		query_len >= LDNS_HEADER_SIZE && LDNS_QDCOUNT(query_pkt)!=0
   1759 		&& LDNS_QDCOUNT(orig)!=0) {
   1760 		/* in this case olen != 0 and QDCOUNT(orig)!=0 */
   1761 		/* copy query section */
   1762 		size_t dlen = get_qname_len(query_pkt, query_len);
   1763 		size_t olen = get_qname_len(orig, origlen);
   1764 		reslen = origlen + dlen - olen;
   1765 		res = (uint8_t*)malloc(reslen);
   1766 		if(!res) {
   1767 			verbose(1, "out of memory; send without adjust\n");
   1768 			return;
   1769 		}
   1770 		/* copy the header, query, remainder */
   1771 		memcpy(res, orig, LDNS_HEADER_SIZE);
   1772 		memmove(res+LDNS_HEADER_SIZE, query_pkt+LDNS_HEADER_SIZE,
   1773 			dlen+4);
   1774 		memmove(res+LDNS_HEADER_SIZE+dlen+4,
   1775 			orig+LDNS_HEADER_SIZE+olen+4,
   1776 			reslen-(LDNS_HEADER_SIZE+dlen+4));
   1777 	} else if(origlen == 0) {
   1778 		res = NULL;
   1779 		reslen = 0;
   1780 	} else {
   1781 		res = memdup(orig, origlen);
   1782 		reslen = origlen;
   1783 	}
   1784 	if(!res && reslen > 0) {
   1785 		verbose(1, "out of memory; send without adjust\n");
   1786 		return;
   1787 	}
   1788 	/* copy the ID */
   1789 	if(match->copy_id && reslen >= 2 && query_len >= 2)
   1790 		res[1] = query_pkt[1];
   1791 	if(match->copy_id && reslen >= 1 && query_len >= 1)
   1792 		res[0] = query_pkt[0];
   1793 
   1794 	if(match->copy_ednsdata_assume_clientsubnet) {
   1795 		/** Assume there is only one EDNS option, which is ECS.
   1796 		 * Copy source mask from query to scope mask in reply. Assume
   1797 		 * rest of ECS data in response (eg address) matches the query.
   1798 		 */
   1799 		uint8_t* walk_q = orig;
   1800 		size_t walk_qlen = origlen;
   1801 		uint8_t* walk_p = res;
   1802 		size_t walk_plen = reslen;
   1803 
   1804 		if(!pkt_find_edns_opt(&walk_q, &walk_qlen)) {
   1805 			walk_qlen = 0;
   1806 		}
   1807 		if(!pkt_find_edns_opt(&walk_p, &walk_plen)) {
   1808 			walk_plen = 0;
   1809 		}
   1810 		/* class + ttl + rdlen + optcode + optlen + ecs fam + ecs source
   1811 		 * + ecs scope = index 15 */
   1812 		if(walk_qlen >= 15 && walk_plen >= 15) {
   1813 			walk_p[15] = walk_q[14];
   1814 		}
   1815 		if(match->increment_ecs_scope) {
   1816 			walk_p[15]++;
   1817 		}
   1818 	}
   1819 
   1820 	if(match->sleeptime > 0) {
   1821 		verbose(3, "sleeping for %d seconds\n", match->sleeptime);
   1822 #ifdef HAVE_SLEEP
   1823 		sleep(match->sleeptime);
   1824 #else
   1825 		Sleep(match->sleeptime * 1000);
   1826 #endif
   1827 	}
   1828 	*answer_pkt = res;
   1829 	*answer_len = reslen;
   1830 }
   1831 
   1832 /*
   1833  * Parses data buffer to a query, finds the correct answer
   1834  * and calls the given function for every packet to send.
   1835  */
   1836 void
   1837 handle_query(uint8_t* inbuf, ssize_t inlen, struct entry* entries, int* count,
   1838 	enum transport_type transport, void (*sendfunc)(uint8_t*, size_t, void*),
   1839 	void* userdata, FILE* verbose_out)
   1840 {
   1841 	struct reply_packet *p;
   1842 	uint8_t *outbuf = NULL;
   1843 	size_t outlen = 0;
   1844 	struct entry* entry = NULL;
   1845 
   1846 	verbose(1, "query %d: id %d: %s %d bytes: ", ++(*count),
   1847 		(int)(inlen>=2?LDNS_ID_WIRE(inbuf):0),
   1848 		(transport==transport_tcp)?"TCP":"UDP", (int)inlen);
   1849 	if(verbose_out) {
   1850 		char* out = sldns_wire2str_pkt(inbuf, (size_t)inlen);
   1851 		printf("%s\n", out);
   1852 		free(out);
   1853 	}
   1854 
   1855 	/* fill up answer packet */
   1856 	entry = find_match(entries, inbuf, (size_t)inlen, transport);
   1857 	if(!entry || !entry->reply_list) {
   1858 		verbose(1, "no answer packet for this query, no reply.\n");
   1859 		return;
   1860 	}
   1861 	for(p = entry->reply_list; p; p = p->next)
   1862 	{
   1863 		verbose(3, "Answer pkt:\n");
   1864 		if (p->reply_from_hex) {
   1865 			/* try to adjust the hex packet, if it can be
   1866 			 * parsed, we can use adjust rules. if not,
   1867 			 * send packet literally */
   1868 			/* still try to adjust ID if others fail */
   1869 			outlen = sldns_buffer_limit(p->reply_from_hex);
   1870 			outbuf = sldns_buffer_begin(p->reply_from_hex);
   1871 		} else {
   1872 			outbuf = p->reply_pkt;
   1873 			outlen = p->reply_len;
   1874 		}
   1875 		if(!outbuf) {
   1876 			verbose(1, "out of memory\n");
   1877 			return;
   1878 		}
   1879 		/* copies outbuf in memory allocation */
   1880 		adjust_packet(entry, &outbuf, &outlen, inbuf, (size_t)inlen);
   1881 		verbose(1, "Answer packet size: %u bytes.\n", (unsigned int)outlen);
   1882 		if(verbose_out) {
   1883 			char* out = sldns_wire2str_pkt(outbuf, outlen);
   1884 			printf("%s\n", out);
   1885 			free(out);
   1886 		}
   1887 		if(p->packet_sleep) {
   1888 			verbose(3, "sleeping for next packet %d secs\n",
   1889 				p->packet_sleep);
   1890 #ifdef HAVE_SLEEP
   1891 			sleep(p->packet_sleep);
   1892 #else
   1893 			Sleep(p->packet_sleep * 1000);
   1894 #endif
   1895 			verbose(3, "wakeup for next packet "
   1896 				"(slept %d secs)\n", p->packet_sleep);
   1897 		}
   1898 		sendfunc(outbuf, outlen, userdata);
   1899 		free(outbuf);
   1900 		outbuf = NULL;
   1901 		outlen = 0;
   1902 	}
   1903 }
   1904 
   1905 /** delete the list of reply packets */
   1906 void delete_replylist(struct reply_packet* replist)
   1907 {
   1908 	struct reply_packet *p=replist, *np;
   1909 	while(p) {
   1910 		np = p->next;
   1911 		free(p->reply_pkt);
   1912 		sldns_buffer_free(p->reply_from_hex);
   1913 		sldns_buffer_free(p->raw_ednsdata);
   1914 		free(p);
   1915 		p=np;
   1916 	}
   1917 }
   1918 
   1919 void delete_entry(struct entry* list)
   1920 {
   1921 	struct entry *p=list, *np;
   1922 	while(p) {
   1923 		np = p->next;
   1924 		delete_replylist(p->reply_list);
   1925 		free(p);
   1926 		p = np;
   1927 	}
   1928 }
   1929