1c68de748SJulio Merino
2c68de748SJulio Merino #include <setjmp.h>
3c68de748SJulio Merino #include <stdlib.h>
4c68de748SJulio Merino
5c68de748SJulio Merino #include "dhcpd.h"
6c68de748SJulio Merino
7c68de748SJulio Merino jmp_buf env;
8c68de748SJulio Merino
9c68de748SJulio Merino void expand_domain_search(struct packet *packet);
10c68de748SJulio Merino
11c68de748SJulio Merino void
no_option_present()12c68de748SJulio Merino no_option_present()
13c68de748SJulio Merino {
14c68de748SJulio Merino int ret;
15c68de748SJulio Merino struct option_data option;
16c68de748SJulio Merino struct packet p;
17c68de748SJulio Merino
18c68de748SJulio Merino option.data = NULL;
19c68de748SJulio Merino option.len = 0;
20c68de748SJulio Merino p.options[DHO_DOMAIN_SEARCH] = option;
21c68de748SJulio Merino
22c68de748SJulio Merino ret = setjmp(env);
23c68de748SJulio Merino if (ret == 0)
24c68de748SJulio Merino expand_domain_search(&p);
25c68de748SJulio Merino
26c68de748SJulio Merino if (p.options[DHO_DOMAIN_SEARCH].len != 0 ||
27c68de748SJulio Merino p.options[DHO_DOMAIN_SEARCH].data != NULL)
28c68de748SJulio Merino abort();
29c68de748SJulio Merino }
30c68de748SJulio Merino
31c68de748SJulio Merino void
one_domain_valid()32c68de748SJulio Merino one_domain_valid()
33c68de748SJulio Merino {
34c68de748SJulio Merino int ret;
35c68de748SJulio Merino struct packet p;
36c68de748SJulio Merino struct option_data *option;
37c68de748SJulio Merino
38c68de748SJulio Merino char *data = "\007example\003org\0";
39c68de748SJulio Merino char *expected = "example.org.";
40c68de748SJulio Merino
41c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
42c68de748SJulio Merino option->len = 13;
43c68de748SJulio Merino option->data = malloc(option->len);
44c68de748SJulio Merino memcpy(option->data, data, option->len);
45c68de748SJulio Merino
46c68de748SJulio Merino ret = setjmp(env);
47c68de748SJulio Merino if (ret == 0)
48c68de748SJulio Merino expand_domain_search(&p);
49c68de748SJulio Merino
50c68de748SJulio Merino if (option->len != strlen(expected) ||
51c68de748SJulio Merino strcmp(option->data, expected) != 0)
52c68de748SJulio Merino abort();
53c68de748SJulio Merino
54c68de748SJulio Merino free(option->data);
55c68de748SJulio Merino }
56c68de748SJulio Merino
57c68de748SJulio Merino void
one_domain_truncated1()58c68de748SJulio Merino one_domain_truncated1()
59c68de748SJulio Merino {
60c68de748SJulio Merino int ret;
61c68de748SJulio Merino struct option_data *option;
62c68de748SJulio Merino struct packet p;
63c68de748SJulio Merino
64c68de748SJulio Merino char *data = "\007example\003org";
65c68de748SJulio Merino
66c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
67c68de748SJulio Merino option->len = 12;
68c68de748SJulio Merino option->data = malloc(option->len);
69c68de748SJulio Merino memcpy(option->data, data, option->len);
70c68de748SJulio Merino
71c68de748SJulio Merino ret = setjmp(env);
72c68de748SJulio Merino if (ret == 0)
73c68de748SJulio Merino expand_domain_search(&p);
74c68de748SJulio Merino
75c68de748SJulio Merino if (ret != 1)
76c68de748SJulio Merino abort();
77c68de748SJulio Merino
78c68de748SJulio Merino free(option->data);
79c68de748SJulio Merino }
80c68de748SJulio Merino
81c68de748SJulio Merino void
one_domain_truncated2()82c68de748SJulio Merino one_domain_truncated2()
83c68de748SJulio Merino {
84c68de748SJulio Merino int ret;
85c68de748SJulio Merino struct option_data *option;
86c68de748SJulio Merino struct packet p;
87c68de748SJulio Merino
88c68de748SJulio Merino char *data = "\007ex";
89c68de748SJulio Merino
90c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
91c68de748SJulio Merino option->len = 3;
92c68de748SJulio Merino option->data = malloc(option->len);
93c68de748SJulio Merino memcpy(option->data, data, option->len);
94c68de748SJulio Merino
95c68de748SJulio Merino ret = setjmp(env);
96c68de748SJulio Merino if (ret == 0)
97c68de748SJulio Merino expand_domain_search(&p);
98c68de748SJulio Merino
99c68de748SJulio Merino if (ret != 1)
100c68de748SJulio Merino abort();
101c68de748SJulio Merino
102c68de748SJulio Merino free(option->data);
103c68de748SJulio Merino }
104c68de748SJulio Merino
105c68de748SJulio Merino void
two_domains_valid()106c68de748SJulio Merino two_domains_valid()
107c68de748SJulio Merino {
108c68de748SJulio Merino int ret;
109c68de748SJulio Merino struct packet p;
110c68de748SJulio Merino struct option_data *option;
111c68de748SJulio Merino
112c68de748SJulio Merino char *data = "\007example\003org\0\007example\003com\0";
113c68de748SJulio Merino char *expected = "example.org. example.com.";
114c68de748SJulio Merino
115c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
116c68de748SJulio Merino option->len = 26;
117c68de748SJulio Merino option->data = malloc(option->len);
118c68de748SJulio Merino memcpy(option->data, data, option->len);
119c68de748SJulio Merino
120c68de748SJulio Merino ret = setjmp(env);
121c68de748SJulio Merino if (ret == 0)
122c68de748SJulio Merino expand_domain_search(&p);
123c68de748SJulio Merino
124c68de748SJulio Merino if (option->len != strlen(expected) ||
125c68de748SJulio Merino strcmp(option->data, expected) != 0)
126c68de748SJulio Merino abort();
127c68de748SJulio Merino
128c68de748SJulio Merino free(option->data);
129c68de748SJulio Merino }
130c68de748SJulio Merino
131c68de748SJulio Merino void
two_domains_truncated1()132c68de748SJulio Merino two_domains_truncated1()
133c68de748SJulio Merino {
134c68de748SJulio Merino int ret;
135c68de748SJulio Merino struct option_data *option;
136c68de748SJulio Merino struct packet p;
137c68de748SJulio Merino
138c68de748SJulio Merino char *data = "\007example\003org\0\007example\003com";
139c68de748SJulio Merino
140c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
141c68de748SJulio Merino option->len = 25;
142c68de748SJulio Merino option->data = malloc(option->len);
143c68de748SJulio Merino memcpy(option->data, data, option->len);
144c68de748SJulio Merino
145c68de748SJulio Merino ret = setjmp(env);
146c68de748SJulio Merino if (ret == 0)
147c68de748SJulio Merino expand_domain_search(&p);
148c68de748SJulio Merino
149c68de748SJulio Merino if (ret != 1)
150c68de748SJulio Merino abort();
151c68de748SJulio Merino
152c68de748SJulio Merino free(option->data);
153c68de748SJulio Merino }
154c68de748SJulio Merino
155c68de748SJulio Merino void
two_domains_truncated2()156c68de748SJulio Merino two_domains_truncated2()
157c68de748SJulio Merino {
158c68de748SJulio Merino int ret;
159c68de748SJulio Merino struct option_data *option;
160c68de748SJulio Merino struct packet p;
161c68de748SJulio Merino
162c68de748SJulio Merino char *data = "\007example\003org\0\007ex";
163c68de748SJulio Merino
164c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
165c68de748SJulio Merino option->len = 16;
166c68de748SJulio Merino option->data = malloc(option->len);
167c68de748SJulio Merino memcpy(option->data, data, option->len);
168c68de748SJulio Merino
169c68de748SJulio Merino ret = setjmp(env);
170c68de748SJulio Merino if (ret == 0)
171c68de748SJulio Merino expand_domain_search(&p);
172c68de748SJulio Merino
173c68de748SJulio Merino if (ret != 1)
174c68de748SJulio Merino abort();
175c68de748SJulio Merino
176c68de748SJulio Merino free(option->data);
177c68de748SJulio Merino }
178c68de748SJulio Merino
179c68de748SJulio Merino void
two_domains_compressed()180c68de748SJulio Merino two_domains_compressed()
181c68de748SJulio Merino {
182c68de748SJulio Merino int ret;
183c68de748SJulio Merino struct packet p;
184c68de748SJulio Merino struct option_data *option;
185c68de748SJulio Merino
186c68de748SJulio Merino char *data = "\007example\003org\0\006foobar\xc0\x08";
187c68de748SJulio Merino char *expected = "example.org. foobar.org.";
188c68de748SJulio Merino
189c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
190c68de748SJulio Merino option->len = 22;
191c68de748SJulio Merino option->data = malloc(option->len);
192c68de748SJulio Merino memcpy(option->data, data, option->len);
193c68de748SJulio Merino
194c68de748SJulio Merino ret = setjmp(env);
195c68de748SJulio Merino if (ret == 0)
196c68de748SJulio Merino expand_domain_search(&p);
197c68de748SJulio Merino
198c68de748SJulio Merino if (option->len != strlen(expected) ||
199c68de748SJulio Merino strcmp(option->data, expected) != 0)
200c68de748SJulio Merino abort();
201c68de748SJulio Merino
202c68de748SJulio Merino free(option->data);
203c68de748SJulio Merino }
204c68de748SJulio Merino
205c68de748SJulio Merino void
two_domains_infloop()206c68de748SJulio Merino two_domains_infloop()
207c68de748SJulio Merino {
208c68de748SJulio Merino int ret;
209c68de748SJulio Merino struct packet p;
210c68de748SJulio Merino struct option_data *option;
211c68de748SJulio Merino
212c68de748SJulio Merino char *data = "\007example\003org\0\006foobar\xc0\x0d";
213c68de748SJulio Merino
214c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
215c68de748SJulio Merino option->len = 22;
216c68de748SJulio Merino option->data = malloc(option->len);
217c68de748SJulio Merino memcpy(option->data, data, option->len);
218c68de748SJulio Merino
219c68de748SJulio Merino ret = setjmp(env);
220c68de748SJulio Merino if (ret == 0)
221c68de748SJulio Merino expand_domain_search(&p);
222c68de748SJulio Merino
223c68de748SJulio Merino if (ret != 1)
224c68de748SJulio Merino abort();
225c68de748SJulio Merino
226c68de748SJulio Merino free(option->data);
227c68de748SJulio Merino }
228c68de748SJulio Merino
229c68de748SJulio Merino void
two_domains_forwardptr()230c68de748SJulio Merino two_domains_forwardptr()
231c68de748SJulio Merino {
232c68de748SJulio Merino int ret;
233c68de748SJulio Merino struct packet p;
234c68de748SJulio Merino struct option_data *option;
235c68de748SJulio Merino
236c68de748SJulio Merino char *data = "\007example\003org\xc0\x0d\006foobar\0";
237c68de748SJulio Merino
238c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
239c68de748SJulio Merino option->len = 22;
240c68de748SJulio Merino option->data = malloc(option->len);
241c68de748SJulio Merino memcpy(option->data, data, option->len);
242c68de748SJulio Merino
243c68de748SJulio Merino ret = setjmp(env);
244c68de748SJulio Merino if (ret == 0)
245c68de748SJulio Merino expand_domain_search(&p);
246c68de748SJulio Merino
247c68de748SJulio Merino if (ret != 1)
248c68de748SJulio Merino abort();
249c68de748SJulio Merino
250c68de748SJulio Merino free(option->data);
251c68de748SJulio Merino }
252c68de748SJulio Merino
253c68de748SJulio Merino void
two_domains_truncatedptr()254c68de748SJulio Merino two_domains_truncatedptr()
255c68de748SJulio Merino {
256c68de748SJulio Merino int ret;
257c68de748SJulio Merino struct packet p;
258c68de748SJulio Merino struct option_data *option;
259c68de748SJulio Merino
260c68de748SJulio Merino char *data = "\007example\003org\0\006foobar\xc0";
261c68de748SJulio Merino
262c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
263c68de748SJulio Merino option->len = 21;
264c68de748SJulio Merino option->data = malloc(option->len);
265c68de748SJulio Merino memcpy(option->data, data, option->len);
266c68de748SJulio Merino
267c68de748SJulio Merino ret = setjmp(env);
268c68de748SJulio Merino if (ret == 0)
269c68de748SJulio Merino expand_domain_search(&p);
270c68de748SJulio Merino
271c68de748SJulio Merino if (ret != 1)
272c68de748SJulio Merino abort();
273c68de748SJulio Merino
274c68de748SJulio Merino free(option->data);
275c68de748SJulio Merino }
276c68de748SJulio Merino
277c68de748SJulio Merino void
multiple_domains_valid()278c68de748SJulio Merino multiple_domains_valid()
279c68de748SJulio Merino {
280c68de748SJulio Merino int ret;
281c68de748SJulio Merino struct packet p;
282c68de748SJulio Merino struct option_data *option;
283c68de748SJulio Merino
284c68de748SJulio Merino char *data =
285c68de748SJulio Merino "\007example\003org\0\002cl\006foobar\003com\0\002fr\xc0\x10";
286c68de748SJulio Merino
287c68de748SJulio Merino char *expected = "example.org. cl.foobar.com. fr.foobar.com.";
288c68de748SJulio Merino
289c68de748SJulio Merino option = &p.options[DHO_DOMAIN_SEARCH];
290c68de748SJulio Merino option->len = 33;
291c68de748SJulio Merino option->data = malloc(option->len);
292c68de748SJulio Merino memcpy(option->data, data, option->len);
293c68de748SJulio Merino
294c68de748SJulio Merino ret = setjmp(env);
295c68de748SJulio Merino if (ret == 0)
296c68de748SJulio Merino expand_domain_search(&p);
297c68de748SJulio Merino
298c68de748SJulio Merino if (option->len != strlen(expected) ||
299c68de748SJulio Merino strcmp(option->data, expected) != 0)
300c68de748SJulio Merino abort();
301c68de748SJulio Merino
302c68de748SJulio Merino free(option->data);
303c68de748SJulio Merino }
304c68de748SJulio Merino
305c210cac0SAlex Bahm static
306c210cac0SAlex Bahm void
parse_date_helper(const char * string,time_t timestamp)307c210cac0SAlex Bahm parse_date_helper(const char *string, time_t timestamp)
308c210cac0SAlex Bahm {
309c210cac0SAlex Bahm int ret = 0;
310c210cac0SAlex Bahm FILE *file = NULL;
311c210cac0SAlex Bahm time_t ts;
312c210cac0SAlex Bahm
313c210cac0SAlex Bahm file = fopen("/tmp/dhclient.test", "w");
314c210cac0SAlex Bahm if (!file)
315c210cac0SAlex Bahm abort();
316c210cac0SAlex Bahm
317c210cac0SAlex Bahm ret = fwrite(string, strlen(string), 1, file);
318c210cac0SAlex Bahm if (ret <= 0)
319c210cac0SAlex Bahm abort();
320c210cac0SAlex Bahm
321c210cac0SAlex Bahm fclose(file);
322c210cac0SAlex Bahm
323c210cac0SAlex Bahm file = fopen("/tmp/dhclient.test", "r");
324c210cac0SAlex Bahm if (!file)
325c210cac0SAlex Bahm abort();
326c210cac0SAlex Bahm
327c210cac0SAlex Bahm new_parse("test");
328c210cac0SAlex Bahm ts = parse_date(file);
329c210cac0SAlex Bahm if (ts != timestamp)
330c210cac0SAlex Bahm abort();
331c210cac0SAlex Bahm
332c210cac0SAlex Bahm fclose(file);
333c210cac0SAlex Bahm }
334c210cac0SAlex Bahm
335c210cac0SAlex Bahm void
parse_date_valid(void)336c210cac0SAlex Bahm parse_date_valid(void)
337c210cac0SAlex Bahm {
338c210cac0SAlex Bahm int ret;
339c210cac0SAlex Bahm
340c210cac0SAlex Bahm ret = setjmp(env);
341c210cac0SAlex Bahm if (ret != 0)
342c210cac0SAlex Bahm abort();
343c210cac0SAlex Bahm
344c210cac0SAlex Bahm parse_date_helper(" 2 2024/7/2 20:25:50;\n", 1719951950);
345*eb8d2e12SEric van Gyzen #ifndef __i386__
346c210cac0SAlex Bahm parse_date_helper(" 1 2091/7/2 20:25:50;\n", 3834246350);
347*eb8d2e12SEric van Gyzen #endif
348c210cac0SAlex Bahm }
349c210cac0SAlex Bahm
350c68de748SJulio Merino int
main(int argc,char * argv[])351c68de748SJulio Merino main(int argc, char *argv[])
352c68de748SJulio Merino {
353c68de748SJulio Merino
354c68de748SJulio Merino no_option_present();
355c68de748SJulio Merino
356c68de748SJulio Merino one_domain_valid();
357c68de748SJulio Merino one_domain_truncated1();
358c68de748SJulio Merino one_domain_truncated2();
359c68de748SJulio Merino
360c68de748SJulio Merino two_domains_valid();
361c68de748SJulio Merino two_domains_truncated1();
362c68de748SJulio Merino two_domains_truncated2();
363c68de748SJulio Merino
364c68de748SJulio Merino two_domains_compressed();
365c68de748SJulio Merino two_domains_infloop();
366c68de748SJulio Merino two_domains_forwardptr();
367c68de748SJulio Merino two_domains_truncatedptr();
368c68de748SJulio Merino
369c68de748SJulio Merino multiple_domains_valid();
370c68de748SJulio Merino
371c210cac0SAlex Bahm parse_date_valid();
372c210cac0SAlex Bahm
373c68de748SJulio Merino return (0);
374c68de748SJulio Merino }
375