[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAHC9VhRomcexjKHEfSVhK2p-nfk26GWpbO5-+WLODKvnaWm6_A@mail.gmail.com>
Date: Tue, 1 Apr 2025 16:22:01 -0400
From: Paul Moore <paul@...l-moore.com>
To: Debin Zhu <mowenroot@....com>
Cc: pabeni@...hat.com, 1985755126@...com, kuba@...nel.org,
linux-kernel@...r.kernel.org, netdev@...r.kernel.org
Subject: Re: [PATCH v3] netlabel: Fix NULL pointer exception caused by CALIPSO
on IPv4 sockets
On Tue, Apr 1, 2025 at 8:40 AM Debin Zhu <mowenroot@....com> wrote:
>
> When calling netlbl_conn_setattr(), addr->sa_family is used
> to determine the function behavior. If sk is an IPv4 socket,
> but the connect function is called with an IPv6 address,
> the function calipso_sock_setattr() is triggered.
> Inside this function, the following code is executed:
>
> sk_fullsock(__sk) ? inet_sk(__sk)->pinet6 : NULL;
>
> Since sk is an IPv4 socket, pinet6 is NULL, leading to a
> null pointer dereference.
>
> This patch fixes the issue by checking if inet6_sk(sk)
> returns a NULL pointer before accessing pinet6.
>
> Fixes: ceba1832b1b2("calipso: Set the calipso socket label to match the secattr.")
> Signed-off-by: Debin Zhu <mowenroot@....com>
> Signed-off-by: Bitao Ouyang <1985755126@...com>
> Acked-by: Paul Moore <paul@...l-moore.com>
As a FYI in case people aren't seeing the previous messages in this
thread, I did ACK an earlier version of this patch, and while there
have been some changes to the code, they are largely superficial and
my ACK still applies.
The commit description looks okay to me. Paolo, do you plan to take
this via the netdev tree or would you like me to take this?
Regardless, the patch should also be marked for stable.
> ---
> net/ipv6/calipso.c | 23 +++++++++++++++++++----
> 1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/net/ipv6/calipso.c b/net/ipv6/calipso.c
> index dbcea9fee..a8a8736df 100644
> --- a/net/ipv6/calipso.c
> +++ b/net/ipv6/calipso.c
> @@ -1072,8 +1072,13 @@ static int calipso_sock_getattr(struct sock *sk,
> struct ipv6_opt_hdr *hop;
> int opt_len, len, ret_val = -ENOMSG, offset;
> unsigned char *opt;
> - struct ipv6_txoptions *txopts = txopt_get(inet6_sk(sk));
> + struct ipv6_pinfo *pinfo = inet6_sk(sk);
> + struct ipv6_txoptions *txopts;
>
> + if (!pinfo)
> + return -EAFNOSUPPORT;
> +
> + txopts = txopt_get(pinfo);
> if (!txopts || !txopts->hopopt)
> goto done;
>
> @@ -1125,8 +1130,13 @@ static int calipso_sock_setattr(struct sock *sk,
> {
> int ret_val;
> struct ipv6_opt_hdr *old, *new;
> - struct ipv6_txoptions *txopts = txopt_get(inet6_sk(sk));
> -
> + struct ipv6_pinfo *pinfo = inet6_sk(sk);
> + struct ipv6_txoptions *txopts;
> +
> + if (!pinfo)
> + return -EAFNOSUPPORT;
> +
> + txopts = txopt_get(pinfo);
> old = NULL;
> if (txopts)
> old = txopts->hopopt;
> @@ -1153,8 +1163,13 @@ static int calipso_sock_setattr(struct sock *sk,
> static void calipso_sock_delattr(struct sock *sk)
> {
> struct ipv6_opt_hdr *new_hop;
> - struct ipv6_txoptions *txopts = txopt_get(inet6_sk(sk));
> + struct ipv6_pinfo *pinfo = inet6_sk(sk);
> + struct ipv6_txoptions *txopts;
>
> + if (!pinfo)
> + return;
> +
> + txopts = txopt_get(pinfo);
> if (!txopts || !txopts->hopopt)
> goto done;
>
> --
> 2.34.1
--
paul-moore.com
Powered by blists - more mailing lists