| From 540e8a7c1f8fbe212c794adb5e184e511d2fb101 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 1 Apr 2025 20:40:18 +0800 |
| Subject: netlabel: Fix NULL pointer exception caused by CALIPSO on IPv4 |
| sockets |
| |
| From: Debin Zhu <mowenroot@163.com> |
| |
| [ 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 | 21 ++++++++++++++++++--- |
| 1 file changed, 18 insertions(+), 3 deletions(-) |
| |
| diff --git a/net/ipv6/calipso.c b/net/ipv6/calipso.c |
| index 1578ed9e97d89..c07e3da08d2a8 100644 |
| --- a/net/ipv6/calipso.c |
| +++ b/net/ipv6/calipso.c |
| @@ -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; |
| |
| -- |
| 2.39.5 |
| |