]> www.infradead.org Git - users/hch/misc.git/commitdiff
ipv4: cipso: Simplify IP options handling in cipso_v4_error()
authorIdo Schimmel <idosch@nvidia.com>
Mon, 8 Sep 2025 07:32:31 +0000 (10:32 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 11 Sep 2025 10:22:38 +0000 (12:22 +0200)
When __ip_options_compile() is called with an skb, the IP options are
parsed from the skb data into the provided IP option argument. This is
in contrast to the case where the skb argument is NULL and the options
are parsed from opt->__data.

Given that cipso_v4_error() always passes an skb to
__ip_options_compile(), there is no need to allocate an extra 40 bytes
(maximum IP options size).

Therefore, simplify the function by removing these extra bytes and make
the function similar to ipv4_send_dest_unreach() which also calls both
__ip_options_compile() and __icmp_send().

This is a preparation for changing the arguments being passed to
__icmp_send().

No functional changes intended.

Reviewed-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Acked-by: Paul Moore <paul@paul-moore.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250908073238.119240-2-idosch@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv4/cipso_ipv4.c

index 740af8541d2ffdf91dd799aceb416c75be78e117..c7c949c37e2dce13a0463941e4f0fc3794fd51c7 100644 (file)
@@ -1715,8 +1715,7 @@ validate_return:
  */
 void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway)
 {
-       unsigned char optbuf[sizeof(struct ip_options) + 40];
-       struct ip_options *opt = (struct ip_options *)optbuf;
+       struct ip_options opt;
        int res;
 
        if (ip_hdr(skb)->protocol == IPPROTO_ICMP || error != -EACCES)
@@ -1727,19 +1726,19 @@ void cipso_v4_error(struct sk_buff *skb, int error, u32 gateway)
         * so we can not use icmp_send and IPCB here.
         */
 
-       memset(opt, 0, sizeof(struct ip_options));
-       opt->optlen = ip_hdr(skb)->ihl*4 - sizeof(struct iphdr);
+       memset(&opt, 0, sizeof(opt));
+       opt.optlen = ip_hdr(skb)->ihl * 4 - sizeof(struct iphdr);
        rcu_read_lock();
-       res = __ip_options_compile(dev_net(skb->dev), opt, skb, NULL);
+       res = __ip_options_compile(dev_net(skb->dev), &opt, skb, NULL);
        rcu_read_unlock();
 
        if (res)
                return;
 
        if (gateway)
-               __icmp_send(skb, ICMP_DEST_UNREACH, ICMP_NET_ANO, 0, opt);
+               __icmp_send(skb, ICMP_DEST_UNREACH, ICMP_NET_ANO, 0, &opt);
        else
-               __icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_ANO, 0, opt);
+               __icmp_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_ANO, 0, &opt);
 }
 
 /**