The access to dhcpv6 options struct could be unaligned as reported
by UndefinedBehavior Sanitizer:

controller/pinctrl.c:2880:16: runtime error: member access within
misaligned address 0x7bfbe26019a1 for type
'struct dhcpv6_opt_server_id', which requires 2 byte alignment
0x7bfbe26019a1: note: pointer points here
 5f 61 6c  74 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 
00 00  00 00 00 00 00
              ^
    encode_dhcpv6_server_id_opt controller/pinctrl.c:2880
    compose_out_dhcpv6_opts controller/pinctrl.c:2909
    pinctrl_handle_put_dhcpv6_opts controller/pinctrl.c:3198
    process_packet_in controller/pinctrl.c:3700
    pinctrl_recv controller/pinctrl.c:3863
    pinctrl_handler controller/pinctrl.c:3945
    ovsthread_wrapper lib/ovs-thread.c:426

Fixes: 96088d49606b ("controller: Properly handle DHCPv6 Release message")
Signed-off-by: Ales Musil <[email protected]>
---
 controller/pinctrl.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index 3ccacfa2d..6f7ae4037 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -2867,7 +2867,7 @@ exit:
 }
 
 static void
-encode_dhcpv6_server_id_opt(struct ofpbuf *opts, struct eth_addr *mac)
+encode_dhcpv6_server_id_opt(struct ofpbuf *opts, void *user_data)
 {
     /* The Server Identifier option carries a DUID
      * identifying a server between a client and a server.
@@ -2875,15 +2875,15 @@ encode_dhcpv6_server_id_opt(struct ofpbuf *opts, struct 
eth_addr *mac)
      *
      * We use DUID Based on Link-layer Address [DUID-LL].
      */
-    struct dhcpv6_opt_server_id *server_id =
-            ofpbuf_put_zeros(opts, sizeof *server_id);
-    *server_id = (struct dhcpv6_opt_server_id) {
-            .opt.code = htons(DHCPV6_OPT_SERVER_ID_CODE),
-            .opt.len = htons(DHCP6_OPT_SERVER_ID_LEN - DHCP6_OPT_HEADER_LEN),
-            .duid_type = htons(DHCPV6_DUID_LL),
-            .hw_type = htons(DHCPV6_HW_TYPE_ETH),
-            .mac = *mac
+    struct dhcpv6_opt_server_id server_id = {
+        .opt.code = htons(DHCPV6_OPT_SERVER_ID_CODE),
+        .opt.len = htons(DHCP6_OPT_SERVER_ID_LEN - DHCP6_OPT_HEADER_LEN),
+        .duid_type = htons(DHCPV6_DUID_LL),
+        .hw_type = htons(DHCPV6_HW_TYPE_ETH),
     };
+    memcpy(&server_id.mac, user_data, sizeof server_id.mac);
+
+    ofpbuf_put(opts, &server_id, sizeof server_id);
 }
 
 static bool
-- 
2.52.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to