1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-06 08:26:52 +03:00

dhcp-identifier: fix for unaligned write

Reported by Michael Olbrich.
This commit is contained in:
Tom Gundersen 2015-05-19 17:47:19 +02:00
parent 69301c1743
commit 9ee18af3a0
Notes: Lennart Poettering 2015-05-21 19:30:42 +02:00
Backport: bugfix
2 changed files with 7 additions and 5 deletions

View File

@ -46,8 +46,9 @@ int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len) {
if (r < 0) if (r < 0)
return r; return r;
duid->type = htobe16(DHCP6_DUID_EN); unaligned_write_be16(&duid->type, DHCP6_DUID_EN);
duid->en.pen = htobe32(SYSTEMD_PEN); unaligned_write_be32(&duid->en.pen, SYSTEMD_PEN);
*len = sizeof(duid->type) + sizeof(duid->en); *len = sizeof(duid->type) + sizeof(duid->en);
/* a bit of snake-oil perhaps, but no need to expose the machine-id /* 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 /* name is a pointer to memory in the udev_device struct, so must
have the same scope */ have the same scope */
_cleanup_udev_device_unref_ struct udev_device *device = NULL; _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); siphash24((uint8_t*)&id, mac, mac_len, HASH_KEY.bytes);
/* fold into 32 bits */ /* fold into 32 bits */
*_id = (id & 0xffffffff) ^ (id >> 32); unaligned_write_be32(_id, (id & 0xffffffff) ^ (id >> 32));
return 0; return 0;
} }

View File

@ -24,6 +24,7 @@
#include "macro.h" #include "macro.h"
#include "sparse-endian.h" #include "sparse-endian.h"
#include "unaligned.h"
#include "sd-id128.h" #include "sd-id128.h"
/* RFC 3315 section 9.1: /* RFC 3315 section 9.1:
@ -61,4 +62,4 @@ struct duid {
} _packed_; } _packed_;
int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len); 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);