def test_ignore_garbage(kresd_sock, garbage_lengths, single_buffer, query_before): """Send chunk of garbage, prefixed by garbage length. It should be ignored.""" buff = b'' if query_before: # optionally send initial query msg_buff_before, msgid_before = utils.get_msgbuff() if single_buffer: buff += msg_buff_before else: kresd_sock.sendall(msg_buff_before) for glength in garbage_lengths: # prepare garbage data if glength is None: continue garbage_buff = utils.get_prefixed_garbage(glength) if single_buffer: buff += garbage_buff else: kresd_sock.sendall(garbage_buff) msg_buff, msgid = utils.get_msgbuff() # final query buff += msg_buff kresd_sock.sendall(buff) if query_before: answer_before = utils.receive_parse_answer(kresd_sock) assert answer_before.id == msgid_before answer = utils.receive_parse_answer(kresd_sock) assert answer.id == msgid
def resolve_hint(sock, qname): buff, msgid = utils.get_msgbuff(qname) sock.sendall(buff) answer = utils.receive_parse_answer(sock) assert answer.id == msgid assert answer.rcode() == dns.rcode.NOERROR assert answer.answer[0][0].address == HINTS[qname]
def test_prefix_greater_than_message(kresd_sock, send_query): """Prefix is greater than the length of the entire DNS message.""" wire, invalid_msgid = utils.prepare_wire() datalen = len(wire) + 16 invalid_buff = utils.prepare_buffer(wire, datalen) send_query(kresd_sock, invalid_buff) valid_buff, _ = utils.get_msgbuff() kresd_sock.sendall(valid_buff) # invalid_buff is answered (treats additional data as trailing garbage) answer = utils.receive_parse_answer(kresd_sock) assert answer.id == invalid_msgid # parsing stream is broken by the invalid_buff, valid query is never answered with utils.expect_kresd_close(): utils.receive_parse_answer(kresd_sock)
def query_before(sock, buff, single_buffer=False): """Send an initial query and expect a response.""" msg_buff, msgid = utils.get_msgbuff() if single_buffer: sock.sendall(msg_buff + buff) else: sock.sendall(msg_buff) sock.sendall(buff) answer = utils.receive_parse_answer(sock) assert answer.id == msgid
def test_pipelining(kresd_sock): """ First query takes longer to resolve - answer to second query should arrive sooner. This test requires internet connection. """ # initialization (to avoid issues with net.ipv6=true) buff_pre, msgid_pre = utils.get_msgbuff('0.delay.getdnsapi.net.') kresd_sock.sendall(buff_pre) msg_answer = utils.receive_parse_answer(kresd_sock) assert msg_answer.id == msgid_pre # test buff1, msgid1 = utils.get_msgbuff('1500.delay.getdnsapi.net.', msgid=1) buff2, msgid2 = utils.get_msgbuff('1.delay.getdnsapi.net.', msgid=2) buff = buff1 + buff2 kresd_sock.sendall(buff) msg_answer = utils.receive_parse_answer(kresd_sock) assert msg_answer.id == msgid2 msg_answer = utils.receive_parse_answer(kresd_sock) assert msg_answer.id == msgid1
def test_prefix_trailing_garbage(kresd_sock, glength, query_before): """Send messages with trailing garbage (its length included in prefix).""" if query_before: utils.ping_alive(kresd_sock) for _ in range(10): wire, msgid = utils.prepare_wire() wire += utils.get_garbage(glength) buff = utils.prepare_buffer(wire) kresd_sock.sendall(buff) answer = utils.receive_parse_answer(kresd_sock) assert answer.id == msgid time.sleep(0.1)
def test_oob(kresd, sock_func_name): """TCP out-of-band (urgent) data must not crash resolver.""" make_sock = getattr(kresd, sock_func_name) sock = make_sock() msg_buff, msgid = utils.get_msgbuff() sock.sendall(msg_buff, socket.MSG_OOB) try: msg_answer = utils.receive_parse_answer(sock) assert msg_answer.id == msgid except ConnectionError: pass # TODO kresd responds with TCP RST, this should be fixed # check kresd is alive sock2 = make_sock() utils.ping_alive(sock2)