1228259Sdumbbell/* $FreeBSD$ */ 2228259Sdumbbell 3228259Sdumbbell#include <setjmp.h> 4228259Sdumbbell#include <stdlib.h> 5228259Sdumbbell 6228259Sdumbbell#include "dhcpd.h" 7228259Sdumbbell 8228259Sdumbbelljmp_buf env; 9228259Sdumbbell 10228259Sdumbbellvoid expand_domain_search(struct packet *packet); 11228259Sdumbbell 12228259Sdumbbellvoid 13228259Sdumbbellno_option_present() 14228259Sdumbbell{ 15228259Sdumbbell int ret; 16228259Sdumbbell struct option_data option; 17228259Sdumbbell struct packet p; 18228259Sdumbbell 19228259Sdumbbell option.data = NULL; 20228259Sdumbbell option.len = 0; 21228259Sdumbbell p.options[DHO_DOMAIN_SEARCH] = option; 22228259Sdumbbell 23228259Sdumbbell ret = setjmp(env); 24228259Sdumbbell if (ret == 0) 25228259Sdumbbell expand_domain_search(&p); 26228259Sdumbbell 27228259Sdumbbell if (p.options[DHO_DOMAIN_SEARCH].len != 0 || 28228259Sdumbbell p.options[DHO_DOMAIN_SEARCH].data != NULL) 29228259Sdumbbell abort(); 30228259Sdumbbell} 31228259Sdumbbell 32228259Sdumbbellvoid 33228259Sdumbbellone_domain_valid() 34228259Sdumbbell{ 35228259Sdumbbell int ret; 36228259Sdumbbell struct packet p; 37228259Sdumbbell struct option_data *option; 38228259Sdumbbell 39228259Sdumbbell char *data = "\007example\003org\0"; 40228259Sdumbbell char *expected = "example.org."; 41228259Sdumbbell 42228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 43228259Sdumbbell option->len = 13; 44228259Sdumbbell option->data = malloc(option->len); 45228259Sdumbbell memcpy(option->data, data, option->len); 46228259Sdumbbell 47228259Sdumbbell ret = setjmp(env); 48228259Sdumbbell if (ret == 0) 49228259Sdumbbell expand_domain_search(&p); 50228259Sdumbbell 51228259Sdumbbell if (option->len != strlen(expected) || 52228259Sdumbbell strcmp(option->data, expected) != 0) 53228259Sdumbbell abort(); 54228259Sdumbbell 55228259Sdumbbell free(option->data); 56228259Sdumbbell} 57228259Sdumbbell 58228259Sdumbbellvoid 59228259Sdumbbellone_domain_truncated1() 60228259Sdumbbell{ 61228259Sdumbbell int ret; 62228259Sdumbbell struct option_data *option; 63228259Sdumbbell struct packet p; 64228259Sdumbbell 65228259Sdumbbell char *data = "\007example\003org"; 66228259Sdumbbell 67228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 68228259Sdumbbell option->len = 12; 69228259Sdumbbell option->data = malloc(option->len); 70228259Sdumbbell memcpy(option->data, data, option->len); 71228259Sdumbbell 72228259Sdumbbell ret = setjmp(env); 73228259Sdumbbell if (ret == 0) 74228259Sdumbbell expand_domain_search(&p); 75228259Sdumbbell 76228259Sdumbbell if (ret != 1) 77228259Sdumbbell abort(); 78228259Sdumbbell 79228259Sdumbbell free(option->data); 80228259Sdumbbell} 81228259Sdumbbell 82228259Sdumbbellvoid 83228259Sdumbbellone_domain_truncated2() 84228259Sdumbbell{ 85228259Sdumbbell int ret; 86228259Sdumbbell struct option_data *option; 87228259Sdumbbell struct packet p; 88228259Sdumbbell 89228259Sdumbbell char *data = "\007ex"; 90228259Sdumbbell 91228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 92228259Sdumbbell option->len = 3; 93228259Sdumbbell option->data = malloc(option->len); 94228259Sdumbbell memcpy(option->data, data, option->len); 95228259Sdumbbell 96228259Sdumbbell ret = setjmp(env); 97228259Sdumbbell if (ret == 0) 98228259Sdumbbell expand_domain_search(&p); 99228259Sdumbbell 100228259Sdumbbell if (ret != 1) 101228259Sdumbbell abort(); 102228259Sdumbbell 103228259Sdumbbell free(option->data); 104228259Sdumbbell} 105228259Sdumbbell 106228259Sdumbbellvoid 107228259Sdumbbelltwo_domains_valid() 108228259Sdumbbell{ 109228259Sdumbbell int ret; 110228259Sdumbbell struct packet p; 111228259Sdumbbell struct option_data *option; 112228259Sdumbbell 113228259Sdumbbell char *data = "\007example\003org\0\007example\003com\0"; 114228259Sdumbbell char *expected = "example.org. example.com."; 115228259Sdumbbell 116228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 117228259Sdumbbell option->len = 26; 118228259Sdumbbell option->data = malloc(option->len); 119228259Sdumbbell memcpy(option->data, data, option->len); 120228259Sdumbbell 121228259Sdumbbell ret = setjmp(env); 122228259Sdumbbell if (ret == 0) 123228259Sdumbbell expand_domain_search(&p); 124228259Sdumbbell 125228259Sdumbbell if (option->len != strlen(expected) || 126228259Sdumbbell strcmp(option->data, expected) != 0) 127228259Sdumbbell abort(); 128228259Sdumbbell 129228259Sdumbbell free(option->data); 130228259Sdumbbell} 131228259Sdumbbell 132228259Sdumbbellvoid 133228259Sdumbbelltwo_domains_truncated1() 134228259Sdumbbell{ 135228259Sdumbbell int ret; 136228259Sdumbbell struct option_data *option; 137228259Sdumbbell struct packet p; 138228259Sdumbbell 139228259Sdumbbell char *data = "\007example\003org\0\007example\003com"; 140228259Sdumbbell 141228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 142228259Sdumbbell option->len = 25; 143228259Sdumbbell option->data = malloc(option->len); 144228259Sdumbbell memcpy(option->data, data, option->len); 145228259Sdumbbell 146228259Sdumbbell ret = setjmp(env); 147228259Sdumbbell if (ret == 0) 148228259Sdumbbell expand_domain_search(&p); 149228259Sdumbbell 150228259Sdumbbell if (ret != 1) 151228259Sdumbbell abort(); 152228259Sdumbbell 153228259Sdumbbell free(option->data); 154228259Sdumbbell} 155228259Sdumbbell 156228259Sdumbbellvoid 157228259Sdumbbelltwo_domains_truncated2() 158228259Sdumbbell{ 159228259Sdumbbell int ret; 160228259Sdumbbell struct option_data *option; 161228259Sdumbbell struct packet p; 162228259Sdumbbell 163228259Sdumbbell char *data = "\007example\003org\0\007ex"; 164228259Sdumbbell 165228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 166228259Sdumbbell option->len = 16; 167228259Sdumbbell option->data = malloc(option->len); 168228259Sdumbbell memcpy(option->data, data, option->len); 169228259Sdumbbell 170228259Sdumbbell ret = setjmp(env); 171228259Sdumbbell if (ret == 0) 172228259Sdumbbell expand_domain_search(&p); 173228259Sdumbbell 174228259Sdumbbell if (ret != 1) 175228259Sdumbbell abort(); 176228259Sdumbbell 177228259Sdumbbell free(option->data); 178228259Sdumbbell} 179228259Sdumbbell 180228259Sdumbbellvoid 181228259Sdumbbelltwo_domains_compressed() 182228259Sdumbbell{ 183228259Sdumbbell int ret; 184228259Sdumbbell struct packet p; 185228259Sdumbbell struct option_data *option; 186228259Sdumbbell 187228259Sdumbbell char *data = "\007example\003org\0\006foobar\xc0\x08"; 188228259Sdumbbell char *expected = "example.org. foobar.org."; 189228259Sdumbbell 190228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 191228259Sdumbbell option->len = 22; 192228259Sdumbbell option->data = malloc(option->len); 193228259Sdumbbell memcpy(option->data, data, option->len); 194228259Sdumbbell 195228259Sdumbbell ret = setjmp(env); 196228259Sdumbbell if (ret == 0) 197228259Sdumbbell expand_domain_search(&p); 198228259Sdumbbell 199228259Sdumbbell if (option->len != strlen(expected) || 200228259Sdumbbell strcmp(option->data, expected) != 0) 201228259Sdumbbell abort(); 202228259Sdumbbell 203228259Sdumbbell free(option->data); 204228259Sdumbbell} 205228259Sdumbbell 206228259Sdumbbellvoid 207228259Sdumbbelltwo_domains_infloop() 208228259Sdumbbell{ 209228259Sdumbbell int ret; 210228259Sdumbbell struct packet p; 211228259Sdumbbell struct option_data *option; 212228259Sdumbbell 213228259Sdumbbell char *data = "\007example\003org\0\006foobar\xc0\x0d"; 214228259Sdumbbell 215228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 216228259Sdumbbell option->len = 22; 217228259Sdumbbell option->data = malloc(option->len); 218228259Sdumbbell memcpy(option->data, data, option->len); 219228259Sdumbbell 220228259Sdumbbell ret = setjmp(env); 221228259Sdumbbell if (ret == 0) 222228259Sdumbbell expand_domain_search(&p); 223228259Sdumbbell 224228259Sdumbbell if (ret != 1) 225228259Sdumbbell abort(); 226228259Sdumbbell 227228259Sdumbbell free(option->data); 228228259Sdumbbell} 229228259Sdumbbell 230228259Sdumbbellvoid 231228259Sdumbbelltwo_domains_forwardptr() 232228259Sdumbbell{ 233228259Sdumbbell int ret; 234228259Sdumbbell struct packet p; 235228259Sdumbbell struct option_data *option; 236228259Sdumbbell 237228259Sdumbbell char *data = "\007example\003org\xc0\x0d\006foobar\0"; 238228259Sdumbbell 239228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 240228259Sdumbbell option->len = 22; 241228259Sdumbbell option->data = malloc(option->len); 242228259Sdumbbell memcpy(option->data, data, option->len); 243228259Sdumbbell 244228259Sdumbbell ret = setjmp(env); 245228259Sdumbbell if (ret == 0) 246228259Sdumbbell expand_domain_search(&p); 247228259Sdumbbell 248228259Sdumbbell if (ret != 1) 249228259Sdumbbell abort(); 250228259Sdumbbell 251228259Sdumbbell free(option->data); 252228259Sdumbbell} 253228259Sdumbbell 254228259Sdumbbellvoid 255228259Sdumbbelltwo_domains_truncatedptr() 256228259Sdumbbell{ 257228259Sdumbbell int ret; 258228259Sdumbbell struct packet p; 259228259Sdumbbell struct option_data *option; 260228259Sdumbbell 261228259Sdumbbell char *data = "\007example\003org\0\006foobar\xc0"; 262228259Sdumbbell 263228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 264228259Sdumbbell option->len = 21; 265228259Sdumbbell option->data = malloc(option->len); 266228259Sdumbbell memcpy(option->data, data, option->len); 267228259Sdumbbell 268228259Sdumbbell ret = setjmp(env); 269228259Sdumbbell if (ret == 0) 270228259Sdumbbell expand_domain_search(&p); 271228259Sdumbbell 272228259Sdumbbell if (ret != 1) 273228259Sdumbbell abort(); 274228259Sdumbbell 275228259Sdumbbell free(option->data); 276228259Sdumbbell} 277228259Sdumbbell 278228259Sdumbbellvoid 279228259Sdumbbellmultiple_domains_valid() 280228259Sdumbbell{ 281228259Sdumbbell int ret; 282228259Sdumbbell struct packet p; 283228259Sdumbbell struct option_data *option; 284228259Sdumbbell 285228259Sdumbbell char *data = 286228259Sdumbbell "\007example\003org\0\002cl\006foobar\003com\0\002fr\xc0\x10"; 287228259Sdumbbell 288228259Sdumbbell char *expected = "example.org. cl.foobar.com. fr.foobar.com."; 289228259Sdumbbell 290228259Sdumbbell option = &p.options[DHO_DOMAIN_SEARCH]; 291228259Sdumbbell option->len = 33; 292228259Sdumbbell option->data = malloc(option->len); 293228259Sdumbbell memcpy(option->data, data, option->len); 294228259Sdumbbell 295228259Sdumbbell ret = setjmp(env); 296228259Sdumbbell if (ret == 0) 297228259Sdumbbell expand_domain_search(&p); 298228259Sdumbbell 299228259Sdumbbell if (option->len != strlen(expected) || 300228259Sdumbbell strcmp(option->data, expected) != 0) 301228259Sdumbbell abort(); 302228259Sdumbbell 303228259Sdumbbell free(option->data); 304228259Sdumbbell} 305228259Sdumbbell 306228259Sdumbbellint 307228259Sdumbbellmain(int argc, char *argv[]) 308228259Sdumbbell{ 309228259Sdumbbell 310228259Sdumbbell no_option_present(); 311228259Sdumbbell 312228259Sdumbbell one_domain_valid(); 313228259Sdumbbell one_domain_truncated1(); 314228259Sdumbbell one_domain_truncated2(); 315228259Sdumbbell 316228259Sdumbbell two_domains_valid(); 317228259Sdumbbell two_domains_truncated1(); 318228259Sdumbbell two_domains_truncated2(); 319228259Sdumbbell 320228259Sdumbbell two_domains_compressed(); 321228259Sdumbbell two_domains_infloop(); 322228259Sdumbbell two_domains_forwardptr(); 323228259Sdumbbell two_domains_truncatedptr(); 324228259Sdumbbell 325228259Sdumbbell multiple_domains_valid(); 326228259Sdumbbell 327228259Sdumbbell return (0); 328228259Sdumbbell} 329