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 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); }
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 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(); }
/* * Parse all available options out of the specified packet. */ void parse_options(struct packet *packet) { /* Initially, zero all option pointers. */ memset(packet->options, 0, sizeof(packet->options)); /* If we don't see the magic cookie, there's nothing to parse. */ if (memcmp(packet->raw->options, DHCP_OPTIONS_COOKIE, 4)) { packet->options_valid = 0; return; } /* * Go through the options field, up to the end of the packet or * the End field. */ parse_option_buffer(packet, &packet->raw->options[4], packet->packet_length - DHCP_FIXED_NON_UDP - 4); /* * If we parsed a DHCP Option Overload option, parse more * options out of the buffer(s) containing them. */ if (packet->options_valid && packet->options[DHO_DHCP_OPTION_OVERLOAD].data) { if (packet->options[DHO_DHCP_OPTION_OVERLOAD].data[0] & 1) parse_option_buffer(packet, (unsigned char *)packet->raw->file, sizeof(packet->raw->file)); if (packet->options[DHO_DHCP_OPTION_OVERLOAD].data[0] & 2) parse_option_buffer(packet, (unsigned char *)packet->raw->sname, sizeof(packet->raw->sname)); } /* Expand DHCP Domain Search option. */ if (packet->options_valid) { expand_domain_search(packet); } }
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_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); }