summaryrefslogtreecommitdiffstats
path: root/src/libsystemd-network
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-09-27 17:48:59 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-09-29 08:18:59 +0200
commite620104956dff64244c0e73e86c3138c0b13b875 (patch)
tree101e08bf8bc7839c51525048a81c6e0753c604c3 /src/libsystemd-network
parentsd-dhcp6-client: modernize dhcp6_option_parse() (diff)
downloadsystemd-e620104956dff64244c0e73e86c3138c0b13b875.tar.xz
systemd-e620104956dff64244c0e73e86c3138c0b13b875.zip
test: add tests for reading unaligned data
Diffstat (limited to 'src/libsystemd-network')
-rw-r--r--src/libsystemd-network/test-dhcp6-client.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/libsystemd-network/test-dhcp6-client.c b/src/libsystemd-network/test-dhcp6-client.c
index f057276476..35aaa2a997 100644
--- a/src/libsystemd-network/test-dhcp6-client.c
+++ b/src/libsystemd-network/test-dhcp6-client.c
@@ -156,7 +156,7 @@ static int test_parse_domain(sd_event *e) {
static int test_option(sd_event *e) {
uint8_t packet[] = {
- 'F', 'O', 'O',
+ 'F', 'O', 'O', 'H', 'O', 'G', 'E',
0x00, SD_DHCP6_OPTION_ORO, 0x00, 0x07,
'A', 'B', 'C', 'D', 'E', 'F', 'G',
0x00, SD_DHCP6_OPTION_VENDOR_CLASS, 0x00, 0x09,
@@ -164,12 +164,13 @@ static int test_option(sd_event *e) {
'B', 'A', 'R',
};
uint8_t result[] = {
- 'F', 'O', 'O',
+ 'F', 'O', 'O', 'H', 'O', 'G', 'E',
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
'B', 'A', 'R',
};
+ _cleanup_free_ uint8_t *buf = NULL;
size_t offset, pos, optlen, outlen = sizeof(result);
const uint8_t *optval;
uint16_t optcode;
@@ -185,16 +186,28 @@ static int test_option(sd_event *e) {
offset = 3;
assert_se(dhcp6_option_parse(packet, 0, &offset, &optcode, &optlen, &optval) == -EBADMSG);
- offset = 3;
+ /* Tests for reading unaligned data. */
+ assert_se(buf = new(uint8_t, sizeof(packet)));
+ for (size_t i = 0; i <= 7; i++) {
+ memcpy(buf, packet + i, sizeof(packet) - i);
+ offset = 7 - i;
+ assert_se(dhcp6_option_parse(buf, sizeof(packet), &offset, &optcode, &optlen, &optval) >= 0);
+
+ assert_se(optcode == SD_DHCP6_OPTION_ORO);
+ assert_se(optlen == 7);
+ assert_se(optval == buf + 11 - i);
+ }
+
+ offset = 7;
assert_se(dhcp6_option_parse(packet, sizeof(packet), &offset, &optcode, &optlen, &optval) >= 0);
assert_se(optcode == SD_DHCP6_OPTION_ORO);
assert_se(optlen == 7);
- assert_se(optval == packet + 7);
+ assert_se(optval == packet + 11);
- pos = 3;
- outlen -= 3;
- out = &result[3];
+ pos = 7;
+ outlen -= 7;
+ out = &result[pos];
assert_se(dhcp6_option_append(&out, &outlen, optcode, optlen, optval) >= 0);
@@ -206,7 +219,7 @@ static int test_option(sd_event *e) {
assert_se(optcode == SD_DHCP6_OPTION_VENDOR_CLASS);
assert_se(optlen == 9);
- assert_se(optval == packet + 18);
+ assert_se(optval == packet + 22);
assert_se(dhcp6_option_append(&out, &outlen, optcode, optlen, optval) >= 0);