diff options
Diffstat (limited to 'mDNSResponder/unittests/mDNSCoreReceiveTest.c')
-rw-r--r-- | mDNSResponder/unittests/mDNSCoreReceiveTest.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/mDNSResponder/unittests/mDNSCoreReceiveTest.c b/mDNSResponder/unittests/mDNSCoreReceiveTest.c new file mode 100644 index 00000000..ece21407 --- /dev/null +++ b/mDNSResponder/unittests/mDNSCoreReceiveTest.c @@ -0,0 +1,151 @@ +#include "mDNSCoreReceiveTest.h" +#include "unittest_common.h" + +int InitmDNSCoreReceiveTest(void); +int ValidQueryReqTest(void); +int NullDstQueryReqTest(void); +int ReceiveArpLogMsgTest(void); +void InitmDNSStorage(mDNS *const m); + +// This DNS message was gleaned from a uDNS query request packet that was captured with Wireshark. +uint8_t udns_query_request_message[28] = { // contains 1 question for www.f5.com + 0x31, 0xca, // transaction id + 0x01, 0x00, // flags + 0x00, 0x01, // 1 question + 0x00, 0x00, // no anwsers + 0x00, 0x00, // no authoritative answers + 0x00, 0x00, // no additionals + 0x03, 0x77, 0x77, 0x77, 0x02, 0x66, 0x35, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01 +}; + +// This DNS message was gleaned from a uDNS query request packet that was captured with Wireshark. +// Then the header id (more specifically, the msg->h.id) was deliberately cleared to force code +// path to traverse regression case, <rdar://problem/28556513>. +uint8_t udns_query_request_message_with_invalid_id[28] = { // contains 1 question for www.f5.com, msg->h.id = 0 + 0x00, 0x00, // transaction id + 0x01, 0x00, // flags + 0x00, 0x01, // 1 question + 0x00, 0x00, // no anwsers + 0x00, 0x00, // no authoritative answers + 0x00, 0x00, // no additionals + 0x03, 0x77, 0x77, 0x77, 0x02, 0x66, 0x35, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01 +}; + +uint8_t arp_request_packet[28] = { // contains 1 question for www.f5.com, msg->h.id = 0 + 0x00, 0x01, // hardware type: enet + 0x08, 0x00, // protocol type: IP + 0x06, // hardware size + 0x04, // Protcol size + 0x00, 0x01, // opcode request + 0x24, 0x01, 0xc7, 0x24, 0x35, 0x00, // Sender mac addr + 0x11, 0xe2, 0x14, 0x01, // Sender ip addr + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // target mac addr + 0x11, 0xe2, 0x17, 0xbe // target ip addr +}; +UNITTEST_HEADER(mDNSCoreReceiveTest) + UNITTEST_TEST(InitmDNSCoreReceiveTest) + UNITTEST_TEST(ValidQueryReqTest) + UNITTEST_TEST(NullDstQueryReqTest) + UNITTEST_TEST(ReceiveArpLogMsgTest) +UNITTEST_FOOTER + +UNITTEST_HEADER(InitmDNSCoreReceiveTest) + mDNSPlatformTimeInit(); + init_logging_ut(); + mDNS_LoggingEnabled = 0; + mDNS_PacketLoggingEnabled = 0; +UNITTEST_FOOTER + +UNITTEST_HEADER(ReceiveArpLogMsgTest) + // Init unit test environment and verify no error occurred. + mStatus result = init_mdns_environment(mDNStrue); + UNITTEST_ASSERT(result == mStatus_NoError); + + UNITTEST_ASSERT(result == mStatus_NoError); + ArpLogMsgTest(&mDNSStorage, (const ARP_EthIP *) arp_request_packet, primary_interfaceID); + UNITTEST_ASSERT(result == mStatus_NoError); +UNITTEST_FOOTER + +UNITTEST_HEADER(ValidQueryReqTest) + mDNS *const m = &mDNSStorage; + mDNSAddr srcaddr, dstaddr; + mDNSIPPort srcport, dstport; + DNSMessage * msg; + const mDNSu8 * end; + + // This test case does not require setup of interfaces, the record's cache, or pending questions + // so m is initialized to all zeros. + InitmDNSStorage(m); + + // Used random values for srcaddr and srcport + srcaddr.type = mDNSAddrType_IPv4; + srcaddr.ip.v4.b[0] = 192; + srcaddr.ip.v4.b[1] = 168; + srcaddr.ip.v4.b[2] = 1; + srcaddr.ip.v4.b[3] = 10; + srcport.NotAnInteger = swap16((mDNSu16)53); + + // Used random values for dstaddr and dstport + dstaddr.type = mDNSAddrType_IPv4; + dstaddr.ip.v4.b[0] = 192; + dstaddr.ip.v4.b[1] = 168; + dstaddr.ip.v4.b[2] = 1; + dstaddr.ip.v4.b[3] = 20; + dstport.NotAnInteger = swap16((mDNSu16)49339); + + // Set message to a DNS message (copied from a WireShark packet) + msg = (DNSMessage *)udns_query_request_message; + end = udns_query_request_message + sizeof(udns_query_request_message); + + // Execute mDNSCoreReceive using a valid DNS message + mDNSCoreReceive(m, msg, end, &srcaddr, srcport, &dstaddr, dstport, if_nametoindex("en0")); + + // Verify that mDNSCoreReceiveQuery traversed the normal code path + UNITTEST_ASSERT(m->mDNSStats.NormalQueries == 1); + +UNITTEST_FOOTER + +UNITTEST_HEADER(NullDstQueryReqTest) + + mDNS *const m = &mDNSStorage; + mDNSAddr srcaddr; + mDNSIPPort srcport, dstport; + DNSMessage * msg; + const mDNSu8 * end; + + // This test case does not require setup of interfaces, the record's cache, or pending questions + // so m is initialized to all zeros. + InitmDNSStorage(m); + + // Used random values for srcaddr and srcport + srcaddr.type = mDNSAddrType_IPv4; + srcaddr.ip.v4.b[0] = 192; + srcaddr.ip.v4.b[1] = 168; + srcaddr.ip.v4.b[2] = 1; + srcaddr.ip.v4.b[3] = 10; + srcport.NotAnInteger = swap16((mDNSu16)53); + + // Used random value for dstport + dstport.NotAnInteger = swap16((mDNSu16)49339); + + // Set message to a DNS message (copied from a WireShark packet) + msg = (DNSMessage *)udns_query_request_message_with_invalid_id; + end = udns_query_request_message_with_invalid_id + sizeof(udns_query_request_message_with_invalid_id); + + // Execute mDNSCoreReceive to regress <rdar://problem/28556513> + mDNSCoreReceive(m, msg, end, &srcaddr, srcport, NULL, dstport, if_nametoindex("en0")); + + // Verify that mDNSCoreReceiveQuery was NOT traversed through the normal code path + UNITTEST_ASSERT(m->mDNSStats.NormalQueries == 0); + + // Verify code path that previously crashed, in <rdar://problem/28556513>, now traverses successfully + // by checking a counter that was incremented on code path that crashed. + UNITTEST_ASSERT(m->MPktNum == 1); + +UNITTEST_FOOTER + +void InitmDNSStorage(mDNS *const m) +{ + memset(m, 0, sizeof(mDNS)); +} + |