]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
netlabel: Fix NULL pointer exception caused by CALIPSO on IPv4 sockets
authorDebin Zhu <mowenroot@163.com>
Tue, 1 Apr 2025 12:40:18 +0000 (20:40 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Apr 2025 12:31:00 +0000 (14:31 +0200)
[ Upstream commit 078aabd567de3d63d37d7673f714e309d369e6e2 ]

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.

Signed-off-by: Debin Zhu <mowenroot@163.com>
Signed-off-by: Bitao Ouyang <1985755126@qq.com>
Acked-by: Paul Moore <paul@paul-moore.com>
Fixes: ceba1832b1b2 ("calipso: Set the calipso socket label to match the secattr.")
Link: https://patch.msgid.link/20250401124018.4763-1-mowenroot@163.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/ipv6/calipso.c

index 0ea66e9db249510e0d9aca7f4049d37965e95bbd..e17e756bb1ad9f075a3ccdabf2a0f057033a7c5d 100644 (file)
@@ -1075,8 +1075,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;
 
@@ -1128,8 +1133,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;
@@ -1156,8 +1166,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;