@@ -47,56 +47,24 @@ static int32_t check_options(const zone_options_t *options)
4747{
4848 if (!options -> accept .callback )
4949 return ZONE_BAD_PARAMETER ;
50- if (!options -> origin )
51- return ZONE_BAD_PARAMETER ;
5250 if (!options -> default_ttl || options -> default_ttl > INT32_MAX )
5351 return ZONE_BAD_PARAMETER ;
52+ if (!options -> origin .octets || !options -> origin .length )
53+ return ZONE_BAD_PARAMETER ;
5454
55- // makes no sense?!?!
56- switch (options -> default_class ) {
57- case ZONE_IN :
58- case ZONE_CS :
59- case ZONE_CH :
60- case ZONE_HS :
61- break ;
62- default :
55+ const uint8_t * root = & options -> origin .octets [options -> origin .length - 1 ];
56+ if (root [0 ] != 0 )
57+ return ZONE_BAD_PARAMETER ;
58+ const uint8_t * label = & options -> origin .octets [0 ];
59+ while (label < root ) {
60+ if (root - label < label [0 ])
6361 return ZONE_BAD_PARAMETER ;
62+ label += label [0 ] + 1 ;
6463 }
6564
66- return 0 ;
67- }
68-
69- // FIXME: replace with parser from fallback
70- static int parse_origin (const char * origin , uint8_t str [255 ], size_t * len )
71- {
72- size_t lab = 0 , oct = 1 ;
73-
74- assert (origin );
75-
76- for (size_t i = 0 ; ; i ++ ) {
77- char chr = origin [i ];
78- if (oct >= 255 )
79- return -1 ;
80-
81- if (chr == '.' || chr == '\0' ) {
82- if (oct - 1 == lab && lab > 0 && chr != '\0' )
83- return -1 ;
84- else if ((oct - lab ) - 1 > 63 )
85- return -1 ;
86- str [lab ] = (uint8_t )((oct - lab ) - 1 );
87- if (chr != '.' )
88- break ;
89- lab = oct ++ ;
90- str [lab ] = 0 ;
91- } else {
92- str [oct ++ ] = chr & 0xff ;
93- }
94- }
95-
96- if (str [lab ] != 0 )
97- return -1 ;
65+ if (label != root )
66+ return ZONE_BAD_PARAMETER ;
9867
99- * len = oct ;
10068 return 0 ;
10169}
10270
@@ -315,10 +283,8 @@ int32_t zone_open(
315283 file = parser -> file = & parser -> first ;
316284 if ((result = open_file (parser , file , path , strlen (path ))) < 0 )
317285 goto error ;
318- if (parse_origin (options -> origin , file -> origin .octets , & file -> origin .length ) < 0 ) {
319- result = ZONE_BAD_PARAMETER ;
320- goto error ;
321- }
286+ memcpy (file -> origin .octets , options -> origin .octets , options -> origin .length );
287+ file -> origin .length = options -> origin .length ;
322288 parser -> buffers .size = buffers -> size ;
323289 parser -> buffers .owner .serial = 0 ;
324290 parser -> buffers .owner .blocks = buffers -> owner ;
@@ -372,9 +338,8 @@ int32_t zone_parse_string(
372338 parser -> options = * options ;
373339 parser -> user_data = user_data ;
374340 file = parser -> file = & parser -> first ;
375- if ((result = parse_origin (options -> origin , file -> origin .octets , & file -> origin .length )) < 0 )
376- return result ;
377-
341+ memcpy (file -> origin .octets , options -> origin .octets , options -> origin .length );
342+ file -> origin .length = options -> origin .length ;
378343 file -> name = (char * )not_a_file ;
379344 file -> path = (char * )not_a_file ;
380345 file -> handle = NULL ;
0 commit comments