Add checks for invalid lengths and parameters when using the option appending function. Add also checks for adding options, see to it that the resulting array is identical to the array of options added. --- src/dhcp/test-dhcp-option.c | 71 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+)
diff --git a/src/dhcp/test-dhcp-option.c b/src/dhcp/test-dhcp-option.c index a2b79ce..51ed47a 100644 --- a/src/dhcp/test-dhcp-option.c +++ b/src/dhcp/test-dhcp-option.c @@ -294,6 +294,75 @@ static void test_options(struct option_desc *desc) free(message); } +static uint8_t result[64] = { + 'A', 'B', 'C', 'D', +}; + +static uint8_t options[64] = { + 'A', 'B', 'C', 'D', + 160, 2, 0x11, 0x12, + 0, + 31, 8, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0, + 55, 3, 0x51, 0x52, 0x53, + 17, 7, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 255 +}; + +static void test_option_set(void) +{ + int len, pos, oldlen, i; + uint8_t *opt; + + assert(__dhcp_option_append(NULL, NULL, 0, 0, NULL) == -EINVAL); + + len = 0; + opt = &result[0]; + assert(__dhcp_option_append(&opt, NULL, 0, 0, NULL) == -EINVAL); + assert(opt == &result[0] && len == 0); + + assert(__dhcp_option_append(&opt, &len, DHCP_OPTION_PAD, + 0, NULL) == -ENOBUFS); + assert(opt == &result[0] && len == 0); + + opt = &result[4]; + len = 1; + assert(__dhcp_option_append(&opt, &len, DHCP_OPTION_PAD, + 0, NULL) >= 0); + assert(opt == &result[5] && len == 0); + + pos = 4; + len = 60; + while (pos < 64 && options[pos] != DHCP_OPTION_END) { + opt = &result[pos]; + oldlen = len; + + assert(__dhcp_option_append(&opt, &len, options[pos], + options[pos + 1], + &options[pos + 2]) >= 0); + + if (options[pos] == DHCP_OPTION_PAD) { + assert(opt == &result[pos + 1]); + assert(len == oldlen - 1); + pos++; + } else { + assert(opt == &result[pos + 2 + options[pos + 1]]); + assert(len == oldlen - 2 - options[pos + 1]); + pos += 2 + options[pos + 1]; + } + } + + for (i = 0; i < pos; i++) { + if (verbose) + printf("%2d: 0x%02x(0x%02x)\n", i, result[i], + options[i]); + assert(result[i] == options[i]); + } + + if (verbose) + printf ("\n"); +} + int main(int argc, char *argv[]) { unsigned int i; @@ -306,5 +375,7 @@ int main(int argc, char *argv[]) for (i = 0; i < sizeof(option_tests)/sizeof(struct option_desc); i++) test_options(&option_tests[i]); + test_option_set(); + return 0; } -- 1.7.10.4 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel