Path: blob/main/sbin/dhclient/tests/option-domain-search.c
39483 views
1#include <setjmp.h>2#include <stdlib.h>34#include "dhcpd.h"56jmp_buf env;78void expand_domain_search(struct packet *packet);910void11no_option_present()12{13int ret;14struct option_data option;15struct packet p;1617option.data = NULL;18option.len = 0;19p.options[DHO_DOMAIN_SEARCH] = option;2021ret = setjmp(env);22if (ret == 0)23expand_domain_search(&p);2425if (p.options[DHO_DOMAIN_SEARCH].len != 0 ||26p.options[DHO_DOMAIN_SEARCH].data != NULL)27abort();28}2930void31one_domain_valid()32{33int ret;34struct packet p;35struct option_data *option;3637char *data = "\007example\003org\0";38char *expected = "example.org.";3940option = &p.options[DHO_DOMAIN_SEARCH];41option->len = 13;42option->data = malloc(option->len);43memcpy(option->data, data, option->len);4445ret = setjmp(env);46if (ret == 0)47expand_domain_search(&p);4849if (option->len != strlen(expected) ||50strcmp(option->data, expected) != 0)51abort();5253free(option->data);54}5556void57one_domain_truncated1()58{59int ret;60struct option_data *option;61struct packet p;6263char *data = "\007example\003org";6465option = &p.options[DHO_DOMAIN_SEARCH];66option->len = 12;67option->data = malloc(option->len);68memcpy(option->data, data, option->len);6970ret = setjmp(env);71if (ret == 0)72expand_domain_search(&p);7374if (ret != 1)75abort();7677free(option->data);78}7980void81one_domain_truncated2()82{83int ret;84struct option_data *option;85struct packet p;8687char *data = "\007ex";8889option = &p.options[DHO_DOMAIN_SEARCH];90option->len = 3;91option->data = malloc(option->len);92memcpy(option->data, data, option->len);9394ret = setjmp(env);95if (ret == 0)96expand_domain_search(&p);9798if (ret != 1)99abort();100101free(option->data);102}103104void105two_domains_valid()106{107int ret;108struct packet p;109struct option_data *option;110111char *data = "\007example\003org\0\007example\003com\0";112char *expected = "example.org. example.com.";113114option = &p.options[DHO_DOMAIN_SEARCH];115option->len = 26;116option->data = malloc(option->len);117memcpy(option->data, data, option->len);118119ret = setjmp(env);120if (ret == 0)121expand_domain_search(&p);122123if (option->len != strlen(expected) ||124strcmp(option->data, expected) != 0)125abort();126127free(option->data);128}129130void131two_domains_truncated1()132{133int ret;134struct option_data *option;135struct packet p;136137char *data = "\007example\003org\0\007example\003com";138139option = &p.options[DHO_DOMAIN_SEARCH];140option->len = 25;141option->data = malloc(option->len);142memcpy(option->data, data, option->len);143144ret = setjmp(env);145if (ret == 0)146expand_domain_search(&p);147148if (ret != 1)149abort();150151free(option->data);152}153154void155two_domains_truncated2()156{157int ret;158struct option_data *option;159struct packet p;160161char *data = "\007example\003org\0\007ex";162163option = &p.options[DHO_DOMAIN_SEARCH];164option->len = 16;165option->data = malloc(option->len);166memcpy(option->data, data, option->len);167168ret = setjmp(env);169if (ret == 0)170expand_domain_search(&p);171172if (ret != 1)173abort();174175free(option->data);176}177178void179two_domains_compressed()180{181int ret;182struct packet p;183struct option_data *option;184185char *data = "\007example\003org\0\006foobar\xc0\x08";186char *expected = "example.org. foobar.org.";187188option = &p.options[DHO_DOMAIN_SEARCH];189option->len = 22;190option->data = malloc(option->len);191memcpy(option->data, data, option->len);192193ret = setjmp(env);194if (ret == 0)195expand_domain_search(&p);196197if (option->len != strlen(expected) ||198strcmp(option->data, expected) != 0)199abort();200201free(option->data);202}203204void205two_domains_infloop()206{207int ret;208struct packet p;209struct option_data *option;210211char *data = "\007example\003org\0\006foobar\xc0\x0d";212213option = &p.options[DHO_DOMAIN_SEARCH];214option->len = 22;215option->data = malloc(option->len);216memcpy(option->data, data, option->len);217218ret = setjmp(env);219if (ret == 0)220expand_domain_search(&p);221222if (ret != 1)223abort();224225free(option->data);226}227228void229two_domains_forwardptr()230{231int ret;232struct packet p;233struct option_data *option;234235char *data = "\007example\003org\xc0\x0d\006foobar\0";236237option = &p.options[DHO_DOMAIN_SEARCH];238option->len = 22;239option->data = malloc(option->len);240memcpy(option->data, data, option->len);241242ret = setjmp(env);243if (ret == 0)244expand_domain_search(&p);245246if (ret != 1)247abort();248249free(option->data);250}251252void253two_domains_truncatedptr()254{255int ret;256struct packet p;257struct option_data *option;258259char *data = "\007example\003org\0\006foobar\xc0";260261option = &p.options[DHO_DOMAIN_SEARCH];262option->len = 21;263option->data = malloc(option->len);264memcpy(option->data, data, option->len);265266ret = setjmp(env);267if (ret == 0)268expand_domain_search(&p);269270if (ret != 1)271abort();272273free(option->data);274}275276void277multiple_domains_valid()278{279int ret;280struct packet p;281struct option_data *option;282283char *data =284"\007example\003org\0\002cl\006foobar\003com\0\002fr\xc0\x10";285286char *expected = "example.org. cl.foobar.com. fr.foobar.com.";287288option = &p.options[DHO_DOMAIN_SEARCH];289option->len = 33;290option->data = malloc(option->len);291memcpy(option->data, data, option->len);292293ret = setjmp(env);294if (ret == 0)295expand_domain_search(&p);296297if (option->len != strlen(expected) ||298strcmp(option->data, expected) != 0)299abort();300301free(option->data);302}303304static305void306parse_date_helper(const char *string, time_t timestamp)307{308int ret = 0;309FILE *file = NULL;310time_t ts;311312file = fopen("/tmp/dhclient.test", "w");313if (!file)314abort();315316ret = fwrite(string, strlen(string), 1, file);317if (ret <= 0)318abort();319320fclose(file);321322file = fopen("/tmp/dhclient.test", "r");323if (!file)324abort();325326new_parse("test");327ts = parse_date(file);328if (ts != timestamp)329abort();330331fclose(file);332}333334void335parse_date_valid(void)336{337int ret;338339ret = setjmp(env);340if (ret != 0)341abort();342343parse_date_helper(" 2 2024/7/2 20:25:50;\n", 1719951950);344#ifndef __i386__345parse_date_helper(" 1 2091/7/2 20:25:50;\n", 3834246350);346#endif347}348349int350main(int argc, char *argv[])351{352353no_option_present();354355one_domain_valid();356one_domain_truncated1();357one_domain_truncated2();358359two_domains_valid();360two_domains_truncated1();361two_domains_truncated2();362363two_domains_compressed();364two_domains_infloop();365two_domains_forwardptr();366two_domains_truncatedptr();367368multiple_domains_valid();369370parse_date_valid();371372return (0);373}374375376