Commit 078aabd5 authored by Debin Zhu's avatar Debin Zhu Committed by Jakub Kicinski
Browse files

netlabel: Fix NULL pointer exception caused by CALIPSO on IPv4 sockets



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: default avatarDebin Zhu <mowenroot@163.com>
Signed-off-by: default avatarBitao Ouyang <1985755126@qq.com>
Acked-by: default avatarPaul Moore <paul@paul-moore.com>
Fixes: ceba1832 ("calipso: Set the calipso socket label to match the secattr.")
Link: https://patch.msgid.link/20250401124018.4763-1-mowenroot@163.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent acc4d5ff
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -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;