X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-network%2Fdhcp6-option.c;h=e6a31778f47a7c3e68ddf1b3f5e74d3bb9e1ad12;hb=07a60cc13c48c5f79616b07aad2808bfe809de22;hp=f488832cf919ca4406c3a192ee124b9b05cb8323;hpb=c6affce8740bb0cee42eebf6d1d44dd518035e88;p=elogind.git diff --git a/src/libsystemd-network/dhcp6-option.c b/src/libsystemd-network/dhcp6-option.c index f488832cf..e6a31778f 100644 --- a/src/libsystemd-network/dhcp6-option.c +++ b/src/libsystemd-network/dhcp6-option.c @@ -32,7 +32,6 @@ #define DHCP6_OPTION_HDR_LEN 4 #define DHCP6_OPTION_IA_NA_LEN 12 #define DHCP6_OPTION_IA_TA_LEN 4 -#define DHCP6_OPTION_IAADDR_LEN 24 static int option_append_hdr(uint8_t **buf, size_t *buflen, uint16_t optcode, size_t optlen) { @@ -58,13 +57,14 @@ int dhcp6_option_append(uint8_t **buf, size_t *buflen, uint16_t code, size_t optlen, const void *optval) { int r; - assert_return(optval, -EINVAL); + assert_return(optval || optlen == 0, -EINVAL); r = option_append_hdr(buf, buflen, code, optlen); if (r < 0) return r; - memcpy(*buf, optval, optlen); + if (optval) + memcpy(*buf, optval, optlen); *buf += optlen; *buflen -= optlen; @@ -110,16 +110,16 @@ int dhcp6_option_append_ia(uint8_t **buf, size_t *buflen, DHCP6IA *ia) { LIST_FOREACH(addresses, addr, ia->addresses) { r = option_append_hdr(buf, buflen, DHCP6_OPTION_IAADDR, - DHCP6_OPTION_IAADDR_LEN); + sizeof(addr->iaaddr)); if (r < 0) return r; - memcpy(*buf, &addr->address, DHCP6_OPTION_IAADDR_LEN); + memcpy(*buf, &addr->iaaddr, sizeof(addr->iaaddr)); - *buf += DHCP6_OPTION_IAADDR_LEN; - *buflen -= DHCP6_OPTION_IAADDR_LEN; + *buf += sizeof(addr->iaaddr); + *buflen -= sizeof(addr->iaaddr); - ia_addrlen += DHCP6_OPTION_HDR_LEN + DHCP6_OPTION_IAADDR_LEN; + ia_addrlen += DHCP6_OPTION_HDR_LEN + sizeof(addr->iaaddr); } r = option_append_hdr(&ia_hdr, &ia_buflen, ia->type, len + ia_addrlen); @@ -191,7 +191,7 @@ int dhcp6_option_parse_ia(uint8_t **buf, size_t *buflen, uint16_t iatype, case DHCP6_OPTION_IA_NA: if (*buflen < DHCP6_OPTION_IA_NA_LEN + DHCP6_OPTION_HDR_LEN + - DHCP6_OPTION_IAADDR_LEN) { + sizeof(addr->iaaddr)) { r = -ENOBUFS; goto error; } @@ -213,7 +213,7 @@ int dhcp6_option_parse_ia(uint8_t **buf, size_t *buflen, uint16_t iatype, case DHCP6_OPTION_IA_TA: if (*buflen < DHCP6_OPTION_IA_TA_LEN + DHCP6_OPTION_HDR_LEN + - DHCP6_OPTION_IAADDR_LEN) { + sizeof(addr->iaaddr)) { r = -ENOBUFS; goto error; } @@ -249,10 +249,10 @@ int dhcp6_option_parse_ia(uint8_t **buf, size_t *buflen, uint16_t iatype, LIST_INIT(addresses, addr); - memcpy(&addr->address, *buf, DHCP6_OPTION_IAADDR_LEN); + memcpy(&addr->iaaddr, *buf, sizeof(addr->iaaddr)); - lt_valid = be32toh(addr->lifetime_valid); - lt_pref = be32toh(addr->lifetime_valid); + lt_valid = be32toh(addr->iaaddr.lifetime_valid); + lt_pref = be32toh(addr->iaaddr.lifetime_valid); if (!lt_valid || lt_pref > lt_valid) { log_dhcp6_client(client, "IA preferred %ds > valid %ds",