Offsets within 'rewrite' action are not 4-byte aligned, so has to
be accessed carefully.

 SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior lib/tc.c:1132:17 in

 lib/tc.c:1132:17: runtime error: store to misaligned address 0x7fba215b2025
   for type 'ovs_be32' (aka 'unsigned int'), which requires 4 byte alignment

    0 0xd78857 in nl_parse_act_pedit lib/tc.c:1132:24
    1 0xd68103 in nl_parse_single_action lib/tc.c:1936:15
    2 0xd624ee in nl_parse_flower_actions lib/tc.c:2024:19
    3 0xd624ee in nl_parse_flower_options lib/tc.c:2139:12
    4 0xd5f082 in parse_netlink_to_tc_flower lib/tc.c:2187:12
    5 0xd6a2a1 in tc_replace_flower lib/tc.c:3776:19
    6 0xd2ae8f in netdev_tc_flow_put lib/netdev-offload-tc.c:2350:11
    7 0x951d07 in netdev_flow_put lib/netdev-offload.c:318:14
    8 0xcbb81a in parse_flow_put lib/dpif-netlink.c:2297:11
    9 0xcbb81a in try_send_to_netdev lib/dpif-netlink.c:2384:15
    10 0xcbb81a in dpif_netlink_operate lib/dpif-netlink.c:2455:23
    11 0x8678ae in dpif_operate lib/dpif.c:1372:13
    12 0x6bcc89 in handle_upcalls ofproto/ofproto-dpif-upcall.c:1674:5
    13 0x6bcc89 in recv_upcalls ofproto/ofproto-dpif-upcall.c:905:9
    14 0x6b7f9a in udpif_upcall_handler ofproto/ofproto-dpif-upcall.c:801:13
    15 0xb54c5a in ovsthread_wrapper lib/ovs-thread.c:422:12
    16 0x7fba2f2081ce in start_thread (/lib64/libpthread.so.0+0x81ce)
    17 0x7fba2de39dd2 in clone (/lib64/libc.so.6+0x39dd2)

Fixes: 8ada482bbe19 ("tc: Add header rewrite using tc pedit action")
Signed-off-by: Ilya Maximets <[email protected]>
---

Version 2:
  - Fixed type issues - replaced u32 with be32 as rightfully
    flagged by sparse.

 lib/tc.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/lib/tc.c b/lib/tc.c
index 94044cde6..fe7604065 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -1114,7 +1114,7 @@ nl_parse_act_pedit(struct nlattr *options, struct 
tc_flower *flower)
                 int diff = flower_off + (keys->off - mf);
                 ovs_be32 *dst = (void *) (rewrite_key + diff);
                 ovs_be32 *dst_m = (void *) (rewrite_mask + diff);
-                ovs_be32 mask, mask_word, data_word;
+                ovs_be32 mask, mask_word, data_word, val;
                 uint32_t zero_bits;
 
                 mask_word = htonl(ntohl(keys->mask) << m->boundary_shift);
@@ -1129,8 +1129,13 @@ nl_parse_act_pedit(struct nlattr *options, struct 
tc_flower *flower)
                     mask &= htonl(UINT32_MAX << zero_bits);
                 }
 
-                *dst_m |= mask;
-                *dst |= data_word & mask;
+                val = get_unaligned_be32(dst_m);
+                val |= mask;
+                put_unaligned_be32(dst_m, val);
+
+                val = get_unaligned_be32(dst);
+                val |= data_word & mask;
+                put_unaligned_be32(dst, val);
             }
         }
 
-- 
2.37.3

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

Reply via email to