c68de7484a
Pretty much all that this change does is shuffles the code around and hooks it into the regular build. The code of the old tests has not changed.
329 lines
5.5 KiB
C
329 lines
5.5 KiB
C
/* $FreeBSD$ */
|
|
|
|
#include <setjmp.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "dhcpd.h"
|
|
|
|
jmp_buf env;
|
|
|
|
void expand_domain_search(struct packet *packet);
|
|
|
|
void
|
|
no_option_present()
|
|
{
|
|
int ret;
|
|
struct option_data option;
|
|
struct packet p;
|
|
|
|
option.data = NULL;
|
|
option.len = 0;
|
|
p.options[DHO_DOMAIN_SEARCH] = option;
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (p.options[DHO_DOMAIN_SEARCH].len != 0 ||
|
|
p.options[DHO_DOMAIN_SEARCH].data != NULL)
|
|
abort();
|
|
}
|
|
|
|
void
|
|
one_domain_valid()
|
|
{
|
|
int ret;
|
|
struct packet p;
|
|
struct option_data *option;
|
|
|
|
char *data = "\007example\003org\0";
|
|
char *expected = "example.org.";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 13;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (option->len != strlen(expected) ||
|
|
strcmp(option->data, expected) != 0)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
one_domain_truncated1()
|
|
{
|
|
int ret;
|
|
struct option_data *option;
|
|
struct packet p;
|
|
|
|
char *data = "\007example\003org";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 12;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (ret != 1)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
one_domain_truncated2()
|
|
{
|
|
int ret;
|
|
struct option_data *option;
|
|
struct packet p;
|
|
|
|
char *data = "\007ex";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 3;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (ret != 1)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
two_domains_valid()
|
|
{
|
|
int ret;
|
|
struct packet p;
|
|
struct option_data *option;
|
|
|
|
char *data = "\007example\003org\0\007example\003com\0";
|
|
char *expected = "example.org. example.com.";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 26;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (option->len != strlen(expected) ||
|
|
strcmp(option->data, expected) != 0)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
two_domains_truncated1()
|
|
{
|
|
int ret;
|
|
struct option_data *option;
|
|
struct packet p;
|
|
|
|
char *data = "\007example\003org\0\007example\003com";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 25;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (ret != 1)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
two_domains_truncated2()
|
|
{
|
|
int ret;
|
|
struct option_data *option;
|
|
struct packet p;
|
|
|
|
char *data = "\007example\003org\0\007ex";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 16;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (ret != 1)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
two_domains_compressed()
|
|
{
|
|
int ret;
|
|
struct packet p;
|
|
struct option_data *option;
|
|
|
|
char *data = "\007example\003org\0\006foobar\xc0\x08";
|
|
char *expected = "example.org. foobar.org.";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 22;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (option->len != strlen(expected) ||
|
|
strcmp(option->data, expected) != 0)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
two_domains_infloop()
|
|
{
|
|
int ret;
|
|
struct packet p;
|
|
struct option_data *option;
|
|
|
|
char *data = "\007example\003org\0\006foobar\xc0\x0d";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 22;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (ret != 1)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
two_domains_forwardptr()
|
|
{
|
|
int ret;
|
|
struct packet p;
|
|
struct option_data *option;
|
|
|
|
char *data = "\007example\003org\xc0\x0d\006foobar\0";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 22;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (ret != 1)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
two_domains_truncatedptr()
|
|
{
|
|
int ret;
|
|
struct packet p;
|
|
struct option_data *option;
|
|
|
|
char *data = "\007example\003org\0\006foobar\xc0";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 21;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (ret != 1)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
void
|
|
multiple_domains_valid()
|
|
{
|
|
int ret;
|
|
struct packet p;
|
|
struct option_data *option;
|
|
|
|
char *data =
|
|
"\007example\003org\0\002cl\006foobar\003com\0\002fr\xc0\x10";
|
|
|
|
char *expected = "example.org. cl.foobar.com. fr.foobar.com.";
|
|
|
|
option = &p.options[DHO_DOMAIN_SEARCH];
|
|
option->len = 33;
|
|
option->data = malloc(option->len);
|
|
memcpy(option->data, data, option->len);
|
|
|
|
ret = setjmp(env);
|
|
if (ret == 0)
|
|
expand_domain_search(&p);
|
|
|
|
if (option->len != strlen(expected) ||
|
|
strcmp(option->data, expected) != 0)
|
|
abort();
|
|
|
|
free(option->data);
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
|
|
no_option_present();
|
|
|
|
one_domain_valid();
|
|
one_domain_truncated1();
|
|
one_domain_truncated2();
|
|
|
|
two_domains_valid();
|
|
two_domains_truncated1();
|
|
two_domains_truncated2();
|
|
|
|
two_domains_compressed();
|
|
two_domains_infloop();
|
|
two_domains_forwardptr();
|
|
two_domains_truncatedptr();
|
|
|
|
multiple_domains_valid();
|
|
|
|
return (0);
|
|
}
|