diff options
author | Tom Gundersen <teg@jklm.no> | 2015-05-19 17:47:19 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-05-19 18:00:26 +0200 |
commit | 9ee18af3a036074c4021c82ae2e67f5ccaa9ea9d (patch) | |
tree | 73fd1989f68c85cac33487634ca8e242f0bdde78 | |
parent | 69301c17439d276e1596f76b9a137396b268267b (diff) |
dhcp-identifier: fix for unaligned write
Reported by Michael Olbrich.
-rw-r--r-- | src/libsystemd-network/dhcp-identifier.c | 9 | ||||
-rw-r--r-- | src/libsystemd-network/dhcp-identifier.h | 3 |
2 files changed, 7 insertions, 5 deletions
diff --git a/src/libsystemd-network/dhcp-identifier.c b/src/libsystemd-network/dhcp-identifier.c index f7a1492363..70c68ad131 100644 --- a/src/libsystemd-network/dhcp-identifier.c +++ b/src/libsystemd-network/dhcp-identifier.c @@ -46,8 +46,9 @@ int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len) { if (r < 0) return r; - duid->type = htobe16(DHCP6_DUID_EN); - duid->en.pen = htobe32(SYSTEMD_PEN); + unaligned_write_be16(&duid->type, DHCP6_DUID_EN); + unaligned_write_be32(&duid->en.pen, SYSTEMD_PEN); + *len = sizeof(duid->type) + sizeof(duid->en); /* a bit of snake-oil perhaps, but no need to expose the machine-id @@ -58,7 +59,7 @@ int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len) { } -int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, uint32_t *_id) { +int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, void *_id) { /* name is a pointer to memory in the udev_device struct, so must have the same scope */ _cleanup_udev_device_unref_ struct udev_device *device = NULL; @@ -92,7 +93,7 @@ int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, uint32_t siphash24((uint8_t*)&id, mac, mac_len, HASH_KEY.bytes); /* fold into 32 bits */ - *_id = (id & 0xffffffff) ^ (id >> 32); + unaligned_write_be32(_id, (id & 0xffffffff) ^ (id >> 32)); return 0; } diff --git a/src/libsystemd-network/dhcp-identifier.h b/src/libsystemd-network/dhcp-identifier.h index 643d4970d5..95117915f4 100644 --- a/src/libsystemd-network/dhcp-identifier.h +++ b/src/libsystemd-network/dhcp-identifier.h @@ -24,6 +24,7 @@ #include "macro.h" #include "sparse-endian.h" +#include "unaligned.h" #include "sd-id128.h" /* RFC 3315 section 9.1: @@ -61,4 +62,4 @@ struct duid { } _packed_; int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len); -int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, uint32_t *_id); +int dhcp_identifier_set_iaid(int ifindex, uint8_t *mac, size_t mac_len, void *_id); |