2 * Copyright (c) 2006-2007 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include <sys/types.h>
18 #include <sys/socket.h>
19 #include <netinet/in.h>
21 #include <arpa/nameser.h>
23 #include <arpa/nameser8_compat.h>
37 START_TEST(test_read_putshort)
44 for (i = 0; i < 65536; i++) {
47 fail_unless(ntohs(k) == i,
48 "Bad value on putshort for %d: %d != %d",
52 readshort(NULL, &p, (short *) &l);
54 "Bad value on readshort for %d: %d != %d",
60 START_TEST(test_read_putlong)
68 for (i = 0; i < 32; i++) {
74 fail_unless(ntohl(k) == j,
75 "Bad value on putlong for %d: %d != %d", i, ntohl(j), j);
78 readlong(NULL, &p, &l);
81 "Bad value on readlong for %d: %d != %d", i, l, j);
86 START_TEST(test_read_name)
88 unsigned char emptyloop[] = {
89 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01 };
91 unsigned char infloop[] = {
92 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x01, 'A', 0xc0, 0x0c, 0x00, 0x01, 0x00, 0x01 };
94 unsigned char longname[] =
95 "AA\x81\x80\x00\x01\x00\x00\x00\x00\x00\x00"
96 "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA"
97 "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA"
98 "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA"
99 "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA"
100 "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA"
101 "\x3FzBCDEFGHIJKLMNOPQURSTUVXYZ0123456789abcdefghijklmnopqrstuvxyzAA"
102 "\x00\x00\x01\x00\x01";
103 unsigned char onejump[] =
104 "AA\x81\x80\x00\x01\x00\x00\x00\x00\x00\x00"
105 "\x02hh\xc0\x15\x00\x01\x00\x01\x05zBCDE\x00";
106 unsigned char badjump[] = {
107 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0xfe, 0xcc, 0x00, 0x01, 0x00, 0x01 };
109 unsigned char badjump2[] = {
110 'A', 'A', 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x02, 'B', 'A', 0xfe, 0xcc, 0x00, 0x01, 0x00, 0x01 };
112 unsigned char *jumper;
117 memset(buf, 0, sizeof(buf));
118 data = (char*) emptyloop + sizeof(HEADER);
120 rv = readname((char *) emptyloop, sizeof(emptyloop), &data, buf, 1023);
121 fail_unless(buf[1023] == 'A', NULL);
123 memset(buf, 0, sizeof(buf));
124 data = (char*) infloop + sizeof(HEADER);
126 rv = readname((char*) infloop, sizeof(infloop), &data, buf, 4);
127 fail_unless(buf[4] == '\a', NULL);
129 memset(buf, 0, sizeof(buf));
130 data = (char*) longname + sizeof(HEADER);
132 rv = readname((char*) longname, sizeof(longname), &data, buf, 256);
133 fail_unless(buf[256] == '\a', NULL);
135 memset(buf, 0, sizeof(buf));
136 data = (char*) onejump + sizeof(HEADER);
137 rv = readname((char*) onejump, sizeof(onejump), &data, buf, 256);
138 fail_unless(rv == 9, NULL);
140 /* These two tests use malloc to cause segfault if jump is executed */
141 memset(buf, 0, sizeof(buf));
142 jumper = malloc(sizeof(badjump));
144 memcpy(jumper, badjump, sizeof(badjump));
145 data = (char*) jumper + sizeof(HEADER);
146 rv = readname((char*) jumper, sizeof(badjump), &data, buf, 256);
148 fail_unless(rv == 0, NULL);
149 fail_unless(buf[0] == 0, NULL);
153 memset(buf, 0, sizeof(buf));
154 jumper = malloc(sizeof(badjump2));
156 memcpy(jumper, badjump2, sizeof(badjump2));
157 data = (char*) jumper + sizeof(HEADER);
158 rv = readname((char*) jumper, sizeof(badjump2), &data, buf, 256);
160 fail_unless(rv == 4, NULL);
161 fail_unless(strcmp("BA.", buf) == 0,
162 "buf is not BA: %s", buf);
168 START_TEST(test_putname)
170 char out[] = "\x06" "BADGER\x06" "BADGER\x04" "KRYO\x02" "SE\x00";
172 char *domain = "BADGER.BADGER.KRYO.SE";
181 ret = putname(&b, 256, domain);
183 fail_unless(ret == strlen(domain) + 1, NULL);
184 fail_unless(strncmp(buf, out, ret) == 0, "Happy flow failed");
188 START_TEST(test_putname_nodot)
192 "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
193 "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ";
202 ret = putname(&b, 256, nodot);
204 fail_unless(ret == -1, NULL);
205 fail_unless(b == buf, NULL);
209 START_TEST(test_putname_toolong)
213 "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ."
214 "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ."
215 "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ."
216 "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ."
217 "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ."
218 "ABCDEFGHIJKLMNOPQRSTUVWXYZ.ABCDEFGHIJKLMNOPQRSTUVWXYZ.";
227 ret = putname(&b, 256, toolong);
229 fail_unless(ret == -1, NULL);
230 fail_unless(b == buf, NULL);
236 test_read_create_tests()
240 tc = tcase_create("Read");
241 tcase_set_timeout(tc, 60);
242 tcase_add_test(tc, test_read_putshort);
243 tcase_add_test(tc, test_read_putlong);
244 tcase_add_test(tc, test_read_name);
245 tcase_add_test(tc, test_putname);
246 tcase_add_test(tc, test_putname_nodot);
247 tcase_add_test(tc, test_putname_toolong);