diff mbox series

[ovs-dev,v2] controller: Fix misaligned access to ip6_hdr

Message ID 20220725151906.677460-1-amusil@redhat.com
State Accepted
Headers show
Series [ovs-dev,v2] controller: Fix misaligned access to ip6_hdr | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes fail github build: failed

Commit Message

Ales Musil July 25, 2022, 3:19 p.m. UTC
The ip6_hdr is aligned to 4 bytes, but the pointer
from dp_packet_l3 is aligned to 2 bytes. Use
ovs_16aligned_ip6_hdr instead to get 2 bytes alignment.

Signed-off-by: Ales Musil <amusil@redhat.com>
---
 controller/pinctrl.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

Comments

Ales Musil July 26, 2022, 5:23 a.m. UTC | #1
I forgot to add the v2 comment, so for clarification just the commit title
has changed between the versions.

Thanks,
Ales

On Mon, Jul 25, 2022 at 5:19 PM Ales Musil <amusil@redhat.com> wrote:

> The ip6_hdr is aligned to 4 bytes, but the pointer
> from dp_packet_l3 is aligned to 2 bytes. Use
> ovs_16aligned_ip6_hdr instead to get 2 bytes alignment.
>
> Signed-off-by: Ales Musil <amusil@redhat.com>
> ---
>  controller/pinctrl.c | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> index 38e8590af..21c78bed4 100644
> --- a/controller/pinctrl.c
> +++ b/controller/pinctrl.c
> @@ -887,7 +887,9 @@ pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
>      OVS_REQUIRES(pinctrl_mutex)
>  {
>      struct eth_header *eth = dp_packet_eth(pkt_in);
> -    struct ip6_hdr *in_ip = dp_packet_l3(pkt_in);
> +    struct ovs_16aligned_ip6_hdr *in_ip = dp_packet_l3(pkt_in);
> +    struct in6_addr ip6_src;
> +    memcpy(&ip6_src, &in_ip->ip6_src, sizeof ip6_src);
>      struct udp_header *udp_in = dp_packet_l4(pkt_in);
>      unsigned char *in_dhcpv6_data = (unsigned char *)(udp_in + 1);
>      size_t dlen = MIN(ntohs(udp_in->udp_len), dp_packet_l4_size(pkt_in));
> @@ -971,7 +973,7 @@ pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
>                          " aid %d", ip6_s, prefix, prefix_len, aid);
>          }
>          pinctrl_prefixd_state_handler(ip_flow, ipv6, aid, eth->eth_src,
> -                                      in_ip->ip6_src, prefix_len, t1, t2,
> +                                      ip6_src, prefix_len, t1, t2,
>                                        plife_time, vlife_time, uuid,
> uuid_len);
>      } else if (uuid) {
>          free(uuid);
> @@ -3736,7 +3738,7 @@ packet_put_ra_rdnss_opt(struct dp_packet *b, uint8_t
> num,
>                          ovs_be32 lifetime, const struct in6_addr *dns)
>  {
>      size_t prev_l4_size = dp_packet_l4_size(b);
> -    struct ip6_hdr *nh = dp_packet_l3(b);
> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
>      size_t len = 2 * num + 1;
>
>      nh->ip6_plen = htons(prev_l4_size + len * 8);
> @@ -3771,7 +3773,7 @@ packet_put_ra_dnssl_opt(struct dp_packet *b,
> ovs_be32 lifetime,
>          return;
>      }
>
> -    struct ip6_hdr *nh = dp_packet_l3(b);
> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
>      nh->ip6_plen = htons(prev_l4_size + size);
>
>      struct ovs_nd_dnssl *nd_dnssl = dp_packet_put_uninit(b, sizeof
> *nd_dnssl);
> @@ -3850,7 +3852,7 @@ packet_put_ra_route_info_opt(struct dp_packet *b,
> ovs_be32 lifetime,
>          }
>      }
>
> -    struct ip6_hdr *nh = dp_packet_l3(b);
> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
>      nh->ip6_plen = htons(prev_l4_size + size);
>      struct ovs_ra_msg *ra = dp_packet_l4(b);
>      ra->icmph.icmp6_cksum = 0;
> --
> 2.35.3
>
>
Mark Michelson Aug. 8, 2022, 7:49 p.m. UTC | #2
Thanks for the clarification Ales.

Acked-by: Mark Michelson <mmichels@redhat.com>

On 7/26/22 01:23, Ales Musil wrote:
> I forgot to add the v2 comment, so for clarification just the commit title
> has changed between the versions.
> 
> Thanks,
> Ales
> 
> On Mon, Jul 25, 2022 at 5:19 PM Ales Musil <amusil@redhat.com> wrote:
> 
>> The ip6_hdr is aligned to 4 bytes, but the pointer
>> from dp_packet_l3 is aligned to 2 bytes. Use
>> ovs_16aligned_ip6_hdr instead to get 2 bytes alignment.
>>
>> Signed-off-by: Ales Musil <amusil@redhat.com>
>> ---
>>   controller/pinctrl.c | 12 +++++++-----
>>   1 file changed, 7 insertions(+), 5 deletions(-)
>>
>> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
>> index 38e8590af..21c78bed4 100644
>> --- a/controller/pinctrl.c
>> +++ b/controller/pinctrl.c
>> @@ -887,7 +887,9 @@ pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
>>       OVS_REQUIRES(pinctrl_mutex)
>>   {
>>       struct eth_header *eth = dp_packet_eth(pkt_in);
>> -    struct ip6_hdr *in_ip = dp_packet_l3(pkt_in);
>> +    struct ovs_16aligned_ip6_hdr *in_ip = dp_packet_l3(pkt_in);
>> +    struct in6_addr ip6_src;
>> +    memcpy(&ip6_src, &in_ip->ip6_src, sizeof ip6_src);
>>       struct udp_header *udp_in = dp_packet_l4(pkt_in);
>>       unsigned char *in_dhcpv6_data = (unsigned char *)(udp_in + 1);
>>       size_t dlen = MIN(ntohs(udp_in->udp_len), dp_packet_l4_size(pkt_in));
>> @@ -971,7 +973,7 @@ pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
>>                           " aid %d", ip6_s, prefix, prefix_len, aid);
>>           }
>>           pinctrl_prefixd_state_handler(ip_flow, ipv6, aid, eth->eth_src,
>> -                                      in_ip->ip6_src, prefix_len, t1, t2,
>> +                                      ip6_src, prefix_len, t1, t2,
>>                                         plife_time, vlife_time, uuid,
>> uuid_len);
>>       } else if (uuid) {
>>           free(uuid);
>> @@ -3736,7 +3738,7 @@ packet_put_ra_rdnss_opt(struct dp_packet *b, uint8_t
>> num,
>>                           ovs_be32 lifetime, const struct in6_addr *dns)
>>   {
>>       size_t prev_l4_size = dp_packet_l4_size(b);
>> -    struct ip6_hdr *nh = dp_packet_l3(b);
>> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
>>       size_t len = 2 * num + 1;
>>
>>       nh->ip6_plen = htons(prev_l4_size + len * 8);
>> @@ -3771,7 +3773,7 @@ packet_put_ra_dnssl_opt(struct dp_packet *b,
>> ovs_be32 lifetime,
>>           return;
>>       }
>>
>> -    struct ip6_hdr *nh = dp_packet_l3(b);
>> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
>>       nh->ip6_plen = htons(prev_l4_size + size);
>>
>>       struct ovs_nd_dnssl *nd_dnssl = dp_packet_put_uninit(b, sizeof
>> *nd_dnssl);
>> @@ -3850,7 +3852,7 @@ packet_put_ra_route_info_opt(struct dp_packet *b,
>> ovs_be32 lifetime,
>>           }
>>       }
>>
>> -    struct ip6_hdr *nh = dp_packet_l3(b);
>> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
>>       nh->ip6_plen = htons(prev_l4_size + size);
>>       struct ovs_ra_msg *ra = dp_packet_l4(b);
>>       ra->icmph.icmp6_cksum = 0;
>> --
>> 2.35.3
>>
>>
>
Numan Siddique Aug. 9, 2022, 9:51 a.m. UTC | #3
On Tue, Aug 9, 2022 at 5:49 AM Mark Michelson <mmichels@redhat.com> wrote:
>
> Thanks for the clarification Ales.
>
> Acked-by: Mark Michelson <mmichels@redhat.com>

Thanks.  I applied this patch to the main branch.

Numan

>
> On 7/26/22 01:23, Ales Musil wrote:
> > I forgot to add the v2 comment, so for clarification just the commit title
> > has changed between the versions.
> >
> > Thanks,
> > Ales
> >
> > On Mon, Jul 25, 2022 at 5:19 PM Ales Musil <amusil@redhat.com> wrote:
> >
> >> The ip6_hdr is aligned to 4 bytes, but the pointer
> >> from dp_packet_l3 is aligned to 2 bytes. Use
> >> ovs_16aligned_ip6_hdr instead to get 2 bytes alignment.
> >>
> >> Signed-off-by: Ales Musil <amusil@redhat.com>
> >> ---
> >>   controller/pinctrl.c | 12 +++++++-----
> >>   1 file changed, 7 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> >> index 38e8590af..21c78bed4 100644
> >> --- a/controller/pinctrl.c
> >> +++ b/controller/pinctrl.c
> >> @@ -887,7 +887,9 @@ pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
> >>       OVS_REQUIRES(pinctrl_mutex)
> >>   {
> >>       struct eth_header *eth = dp_packet_eth(pkt_in);
> >> -    struct ip6_hdr *in_ip = dp_packet_l3(pkt_in);
> >> +    struct ovs_16aligned_ip6_hdr *in_ip = dp_packet_l3(pkt_in);
> >> +    struct in6_addr ip6_src;
> >> +    memcpy(&ip6_src, &in_ip->ip6_src, sizeof ip6_src);
> >>       struct udp_header *udp_in = dp_packet_l4(pkt_in);
> >>       unsigned char *in_dhcpv6_data = (unsigned char *)(udp_in + 1);
> >>       size_t dlen = MIN(ntohs(udp_in->udp_len), dp_packet_l4_size(pkt_in));
> >> @@ -971,7 +973,7 @@ pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
> >>                           " aid %d", ip6_s, prefix, prefix_len, aid);
> >>           }
> >>           pinctrl_prefixd_state_handler(ip_flow, ipv6, aid, eth->eth_src,
> >> -                                      in_ip->ip6_src, prefix_len, t1, t2,
> >> +                                      ip6_src, prefix_len, t1, t2,
> >>                                         plife_time, vlife_time, uuid,
> >> uuid_len);
> >>       } else if (uuid) {
> >>           free(uuid);
> >> @@ -3736,7 +3738,7 @@ packet_put_ra_rdnss_opt(struct dp_packet *b, uint8_t
> >> num,
> >>                           ovs_be32 lifetime, const struct in6_addr *dns)
> >>   {
> >>       size_t prev_l4_size = dp_packet_l4_size(b);
> >> -    struct ip6_hdr *nh = dp_packet_l3(b);
> >> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
> >>       size_t len = 2 * num + 1;
> >>
> >>       nh->ip6_plen = htons(prev_l4_size + len * 8);
> >> @@ -3771,7 +3773,7 @@ packet_put_ra_dnssl_opt(struct dp_packet *b,
> >> ovs_be32 lifetime,
> >>           return;
> >>       }
> >>
> >> -    struct ip6_hdr *nh = dp_packet_l3(b);
> >> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
> >>       nh->ip6_plen = htons(prev_l4_size + size);
> >>
> >>       struct ovs_nd_dnssl *nd_dnssl = dp_packet_put_uninit(b, sizeof
> >> *nd_dnssl);
> >> @@ -3850,7 +3852,7 @@ packet_put_ra_route_info_opt(struct dp_packet *b,
> >> ovs_be32 lifetime,
> >>           }
> >>       }
> >>
> >> -    struct ip6_hdr *nh = dp_packet_l3(b);
> >> +    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
> >>       nh->ip6_plen = htons(prev_l4_size + size);
> >>       struct ovs_ra_msg *ra = dp_packet_l4(b);
> >>       ra->icmph.icmp6_cksum = 0;
> >> --
> >> 2.35.3
> >>
> >>
> >
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
diff mbox series

Patch

diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index 38e8590af..21c78bed4 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -887,7 +887,9 @@  pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
     OVS_REQUIRES(pinctrl_mutex)
 {
     struct eth_header *eth = dp_packet_eth(pkt_in);
-    struct ip6_hdr *in_ip = dp_packet_l3(pkt_in);
+    struct ovs_16aligned_ip6_hdr *in_ip = dp_packet_l3(pkt_in);
+    struct in6_addr ip6_src;
+    memcpy(&ip6_src, &in_ip->ip6_src, sizeof ip6_src);
     struct udp_header *udp_in = dp_packet_l4(pkt_in);
     unsigned char *in_dhcpv6_data = (unsigned char *)(udp_in + 1);
     size_t dlen = MIN(ntohs(udp_in->udp_len), dp_packet_l4_size(pkt_in));
@@ -971,7 +973,7 @@  pinctrl_parse_dhcpv6_reply(struct dp_packet *pkt_in,
                         " aid %d", ip6_s, prefix, prefix_len, aid);
         }
         pinctrl_prefixd_state_handler(ip_flow, ipv6, aid, eth->eth_src,
-                                      in_ip->ip6_src, prefix_len, t1, t2,
+                                      ip6_src, prefix_len, t1, t2,
                                       plife_time, vlife_time, uuid, uuid_len);
     } else if (uuid) {
         free(uuid);
@@ -3736,7 +3738,7 @@  packet_put_ra_rdnss_opt(struct dp_packet *b, uint8_t num,
                         ovs_be32 lifetime, const struct in6_addr *dns)
 {
     size_t prev_l4_size = dp_packet_l4_size(b);
-    struct ip6_hdr *nh = dp_packet_l3(b);
+    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
     size_t len = 2 * num + 1;
 
     nh->ip6_plen = htons(prev_l4_size + len * 8);
@@ -3771,7 +3773,7 @@  packet_put_ra_dnssl_opt(struct dp_packet *b, ovs_be32 lifetime,
         return;
     }
 
-    struct ip6_hdr *nh = dp_packet_l3(b);
+    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
     nh->ip6_plen = htons(prev_l4_size + size);
 
     struct ovs_nd_dnssl *nd_dnssl = dp_packet_put_uninit(b, sizeof *nd_dnssl);
@@ -3850,7 +3852,7 @@  packet_put_ra_route_info_opt(struct dp_packet *b, ovs_be32 lifetime,
         }
     }
 
-    struct ip6_hdr *nh = dp_packet_l3(b);
+    struct ovs_16aligned_ip6_hdr *nh = dp_packet_l3(b);
     nh->ip6_plen = htons(prev_l4_size + size);
     struct ovs_ra_msg *ra = dp_packet_l4(b);
     ra->icmph.icmp6_cksum = 0;