From 545feea82b299574bc0331f7aa8e9dc67eea6dd0 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Thu, 19 Apr 2007 09:48:42 +0000 Subject: [PATCH] Fixups after initial unit test. git-svn-id: file:///svn/unbound/trunk@251 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 9 +++++ testcode/fake_event.c | 3 +- testcode/unitmsgparse.c | 84 ++++++++++++++++++++++++++++++++++++----- util/data/msgreply.c | 30 +++++++-------- util/net_help.c | 4 +- 5 files changed, 103 insertions(+), 27 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index 13b6fee30..da66e1480 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,12 @@ +19 April 2007: Wouter + - fix unit test to actually to tests. + - fix write iov helper, and fakevent code. + - extra builtin testcase (small packet). + - ttl converted to network format in packets. + - flags converted correctly + - rdatalen off by 2 error fixup. + - uses less iov space for header. + 18 April 2007: Wouter - review of msgparse code. - smaller test cases. diff --git a/testcode/fake_event.c b/testcode/fake_event.c index 989846574..9563c2304 100644 --- a/testcode/fake_event.c +++ b/testcode/fake_event.c @@ -614,7 +614,8 @@ void comm_point_send_reply_iov(struct comm_reply* repinfo, struct iovec* iov, size_t iovlen) { - write_iov_buffer(repinfo->c->buffer, iov, iovlen); + /* skip tcp len at [0]. */ + write_iov_buffer(repinfo->c->buffer, iov+1, iovlen-1); comm_point_send_reply(repinfo); } diff --git a/testcode/unitmsgparse.c b/testcode/unitmsgparse.c index 4b6a577ad..eb7887125 100644 --- a/testcode/unitmsgparse.c +++ b/testcode/unitmsgparse.c @@ -85,7 +85,9 @@ static void hex_to_buf(ldns_buffer* pkt, const char* hex) skip_whites(&p); } ldns_buffer_flip(pkt); - if(0) printf("packet size %u\n", (unsigned)ldns_buffer_limit(pkt)); + if(0) { + printf("packet size %u\n", (unsigned)ldns_buffer_limit(pkt)); + } } /** match two rr lists */ @@ -102,6 +104,13 @@ match_list(ldns_rr_list* q, ldns_rr_list *p) verbose(3, "rr %d different", i); return 0; } + /* and check the ttl */ + if(ldns_rr_ttl(ldns_rr_list_rr(q, i)) != + ldns_rr_ttl(ldns_rr_list_rr(p, i))) { + verbose(3, "rr %d ttl different", i); + return 0; + } + } return 1; } @@ -168,11 +177,28 @@ test_buffers(ldns_buffer* pkt, ldns_buffer* out) /* check binary same */ if(ldns_buffer_limit(pkt) == ldns_buffer_limit(out) && memcmp(ldns_buffer_begin(pkt), ldns_buffer_begin(out), - ldns_buffer_limit(pkt)) == 0) + ldns_buffer_limit(pkt)) == 0) { + if(1) printf("binary the same (length=%d)\n", + ldns_buffer_limit(pkt)); return 1; + } /* check if it 'means the same' */ s1 = ldns_buffer2pkt_wire(&p1, pkt); - s2 = ldns_buffer2pkt_wire(&p2, pkt); + s2 = ldns_buffer2pkt_wire(&p2, out); + if(1) { + log_hex("orig in hex", ldns_buffer_begin(pkt), + ldns_buffer_limit(pkt)); + log_hex("unbound out in hex", ldns_buffer_begin(out), + ldns_buffer_limit(out)); + printf("\npacket from unbound (%d):\n", + (int)ldns_buffer_limit(out)); + ldns_pkt_print(stdout, p2); + + printf("\npacket original (%d):\n", + (int)ldns_buffer_limit(pkt)); + ldns_pkt_print(stdout, p1); + printf("\n"); + } if(s1 != s2) { /* oops! */ printf("input ldns parse: %s, output ldns parse: %s.\n", @@ -193,7 +219,7 @@ checkformerr(ldns_buffer* pkt) { ldns_pkt* p; ldns_status status = ldns_buffer2pkt_wire(&p, pkt); - if(0) printf("formerr, ldns parse is: %s\n", + if(1) printf("formerr, ldns parse is: %s\n", ldns_get_errorstr_by_id(status)); if(status == LDNS_STATUS_OK) { printf("Formerr, but ldns gives packet:\n"); @@ -222,9 +248,10 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out, hex_to_buf(pkt, hex); memmove(&id, ldns_buffer_begin(pkt), sizeof(id)); memmove(&flags, ldns_buffer_at(pkt, 2), sizeof(flags)); + flags = ntohs(flags); ret = reply_info_parse(pkt, alloc, &qi, &rep); if(ret != 0) { - if(0) printf("parse code %d: %s\n", ret, + if(1) printf("parse code %d: %s\n", ret, ldns_lookup_by_id(ldns_rcodes, ret)->name); if(ret == LDNS_RCODE_FORMERR) checkformerr(pkt); @@ -234,6 +261,7 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out, timenow, region); unit_assert(sz != 0); /* udp packets should fit in 1024 iov */ write_iov_buffer(out, iov, sz); + printf("iov len outlen %d %d\n", sz, ldns_buffer_limit(out)); test_buffers(pkt, out); } @@ -249,6 +277,18 @@ simpletest(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out) /* a root query drill -q - */ testpkt(pkt, alloc, out, " c5 40 01 00 00 01 00 00 00 00 00 00 00 00 02 00 01 "); + + /* very small packet */ + testpkt(pkt, alloc, out, +"; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n" +";-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" +"74 0c 85 83 00 01 00 00 00 01 00 00 03 62 6c 61 09 6e 6c 6e ; 1- 20\n" +"65 74 6c 61 62 73 02 6e 6c 00 00 0f 00 01 09 6e 6c 6e 65 74 ; 21- 40\n" +"6c 61 62 73 02 6e 6c 00 00 06 00 01 00 00 46 50 00 40 04 6f ; 41- 60\n" +"70 65 6e 09 6e 6c 6e 65 74 6c 61 62 73 02 6e 6c 00 0a 68 6f ; 61- 80\n" +"73 74 6d 61 73 74 65 72 09 6e 6c 6e 65 74 6c 61 62 73 02 6e ; 81- 100\n" +"6c 00 77 a1 02 58 00 00 70 80 00 00 1c 20 00 09 3a 80 00 00 ; 101- 120\n" +"46 50\n"); /* a root reply drill -w - */ testpkt(pkt, alloc, out, @@ -281,7 +321,7 @@ simpletest(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out) " 64 b9 00 04 c0 3a 80 1e "); } -/** simple test of parsing. */ +/** simple test of parsing, pcat file. */ static void testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out, const char* fname) @@ -308,6 +348,31 @@ testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out, fclose(in); } +/** simple test of parsing, drill file. */ +static void +testfromdrillfile(ldns_buffer* pkt, struct alloc_cache* alloc, + ldns_buffer* out, const char* fname) +{ + FILE* in = fopen(fname, "r"); + char buf[102400]; + char *np = buf; + if(!in) { + perror("fname"); + return; + } + while(fgets(np, (int)sizeof(buf) - (np-buf), in)) { + if(np[0] == ';') /* comment */ + continue; + np = &np[strlen(np)]; + } + if(0) { + printf("test %s", buf); + fflush(stdout); + } + testpkt(pkt, alloc, out, buf); + fclose(in); +} + void msgparse_test() { ldns_buffer* pkt = ldns_buffer_new(65553); @@ -319,9 +384,10 @@ void msgparse_test() printf("testmsgparse\n"); simpletest(pkt, &alloc, out); - testfromfile(pkt, &alloc, out, "testdata/test_packets.1"); - testfromfile(pkt, &alloc, out, "testdata/test_packets.2"); - testfromfile(pkt, &alloc, out, "testdata/test_packets.3"); + if(0) testfromdrillfile(pkt, &alloc, out, "blabla"); + if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.1"); + if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.2"); + if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.3"); /* cleanup */ alloc_clear(&alloc); diff --git a/util/data/msgreply.c b/util/data/msgreply.c index a0c791d98..3b4cb1dfc 100644 --- a/util/data/msgreply.c +++ b/util/data/msgreply.c @@ -134,7 +134,8 @@ rdata_copy(ldns_buffer* pkt, struct rrset_parse* pset, if(ttl < data->ttl) data->ttl = ttl; /* insert decompressed size into rdata len stored in memory */ - pkt_len = htons(rr->size); + /* -2 because rdatalen bytes are not included. */ + pkt_len = htons(rr->size - 2); memmove(to, &pkt_len, sizeof(uint16_t)); to += 2; /* read packet rdata len */ @@ -480,7 +481,7 @@ packed_rrset_iov(struct ub_packed_rrset_key* key, struct iovec* iov, key->entry.data; *num_rrs += data->count; if(!ttl) return 0; - *ttl = data->ttl - timenow; + *ttl = htonl(data->ttl - timenow); for(i=0; icount; i++) { if(max - *used < 3) return 0; /* no compression of dnames yet */ @@ -518,18 +519,15 @@ size_t reply_info_iov_regen(struct query_info* qinfo, struct reply_info* rep, uint32_t timenow, region_type* region) { size_t used; - uint16_t* hdr = (uint16_t*)region_alloc(region, sizeof(uint16_t)*4); + uint16_t* hdr = (uint16_t*)region_alloc(region, sizeof(uint16_t)*6); if(!hdr) return 0; - if(max<3) return 0; - flags = htons(flags); - iov[0].iov_base = (void*)&id; - iov[0].iov_len = sizeof(uint16_t); - iov[1].iov_base = (void*)&flags; - iov[1].iov_len = sizeof(uint16_t); - iov[2].iov_base = (void*)&hdr[0]; - iov[2].iov_len = sizeof(uint16_t)*4; - hdr[0] = htons(rep->qdcount); - used=3; + if(max<1) return 0; + hdr[0] = id; + hdr[1] = htons(flags); + iov[0].iov_base = (void*)&hdr[0]; + iov[0].iov_len = sizeof(uint16_t)*6; + hdr[2] = htons(rep->qdcount); + used=1; /* insert query section */ if(rep->qdcount) { @@ -549,17 +547,17 @@ size_t reply_info_iov_regen(struct query_info* qinfo, struct reply_info* rep, } /* insert answer section */ - if(!insert_section(rep, rep->an_numrrsets, &hdr[1], iov, max, + if(!insert_section(rep, rep->an_numrrsets, &hdr[3], iov, max, 0, timenow, region, &used)) return 0; /* insert auth section */ - if(!insert_section(rep, rep->ns_numrrsets, &hdr[2], iov, max, + if(!insert_section(rep, rep->ns_numrrsets, &hdr[4], iov, max, rep->an_numrrsets, timenow, region, &used)) return 0; /* insert add section */ - if(!insert_section(rep, rep->ar_numrrsets, &hdr[3], iov, max, + if(!insert_section(rep, rep->ar_numrrsets, &hdr[5], iov, max, rep->an_numrrsets + rep->ns_numrrsets, timenow, region, &used)) return 0; diff --git a/util/net_help.c b/util/net_help.c index 788b414d5..88aecd379 100644 --- a/util/net_help.c +++ b/util/net_help.c @@ -99,10 +99,12 @@ void write_iov_buffer(ldns_buffer* buffer, struct iovec* iov, size_t iovlen) { size_t i; + size_t s = 0; ldns_buffer_clear(buffer); - for(i=1; i