All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Mickaël Salaün" <mic@digikod.net>
To: Mikhail Ivanov <ivanov.mikhail1@huawei-partners.com>
Cc: gnoack@google.com, willemdebruijn.kernel@gmail.com,
	matthieu@buffet.re,  linux-security-module@vger.kernel.org,
	netdev@vger.kernel.org, netfilter-devel@vger.kernel.org,
	 yusongping@huawei.com, artem.kuzin@huawei.com,
	konstantin.meskhidze@huawei.com
Subject: Re: [RFC PATCH v2 3/8] landlock: Fix inconsistency of errors for TCP actions
Date: Wed, 4 Dec 2024 20:32:32 +0100	[thread overview]
Message-ID: <20241204.ibahfoo6thuG@digikod.net> (raw)
In-Reply-To: <20241017110454.265818-4-ivanov.mikhail1@huawei-partners.com>

Something is wrong with this patch.

On Thu, Oct 17, 2024 at 07:04:49PM +0800, Mikhail Ivanov wrote:
> Add two helpers for TCP bind/connect accesses, which will serve to perform
> action-specific network stack level checks and safely extract the port from
> the address.
> 
> Return -EAFNOSUPPORT instead of -EINVAL in sin_family checks.
> 
> Check socket state before validating address for TCP connect access. This
> is necessary to follow the error order of network stack.
> 
> Read sk_family value from socket structure with READ_ONCE to safely handle
> IPV6_ADDRFORM case (see [1]).
> 
> [1] https://lore.kernel.org/all/20240202095404.183274-1-edumazet@google.com/
> 
> Fixes: fff69fb03dde ("landlock: Support network rules with TCP bind and connect")
> Signed-off-by: Mikhail Ivanov <ivanov.mikhail1@huawei-partners.com>
> ---
>  security/landlock/net.c | 543 +++++++++++++++++++++++-----------------
>  1 file changed, 315 insertions(+), 228 deletions(-)
>  rewrite security/landlock/net.c (37%)
> 
> diff --git a/security/landlock/net.c b/security/landlock/net.c
> dissimilarity index 37%
> index a3142f9b15ee..06791aba9196 100644
> --- a/security/landlock/net.c
> +++ b/security/landlock/net.c
> @@ -1,228 +1,315 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Landlock LSM - Network management and hooks
> - *
> - * Copyright © 2022-2023 Huawei Tech. Co., Ltd.
> - * Copyright © 2022-2023 Microsoft Corporation
> - */
> -
> -#include <linux/in.h>
> -#include <linux/net.h>
> -#include <linux/socket.h>
> -#include <net/ipv6.h>
> -
> -#include "common.h"
> -#include "cred.h"
> -#include "limits.h"
> -#include "net.h"
> -#include "ruleset.h"
> -
> -int landlock_append_net_rule(struct landlock_ruleset *const ruleset,
> -			     const u16 port, access_mask_t access_rights)
> -{
> -	int err;
> -	const struct landlock_id id = {
> -		.key.data = (__force uintptr_t)htons(port),
> -		.type = LANDLOCK_KEY_NET_PORT,
> -	};
> -
> -	BUILD_BUG_ON(sizeof(port) > sizeof(id.key.data));
> -
> -	/* Transforms relative access rights to absolute ones. */
> -	access_rights |= LANDLOCK_MASK_ACCESS_NET &
> -			 ~landlock_get_net_access_mask(ruleset, 0);
> -
> -	mutex_lock(&ruleset->lock);
> -	err = landlock_insert_rule(ruleset, id, access_rights);
> -	mutex_unlock(&ruleset->lock);
> -
> -	return err;
> -}
> -
> -static const struct landlock_ruleset *get_current_net_domain(void)
> -{
> -	const union access_masks any_net = {
> -		.net = ~0,
> -	};
> -
> -	return landlock_match_ruleset(landlock_get_current_domain(), any_net);
> -}
> -
> -static int check_access_port(const struct landlock_ruleset *const dom,
> -			     __be16 port, access_mask_t access_request)
> -{
> -	layer_mask_t layer_masks[LANDLOCK_NUM_ACCESS_NET] = {};
> -	const struct landlock_rule *rule;
> -	struct landlock_id id = {
> -		.type = LANDLOCK_KEY_NET_PORT,
> -	};
> -
> -	id.key.data = (__force uintptr_t)port;
> -	BUILD_BUG_ON(sizeof(port) > sizeof(id.key.data));
> -
> -	rule = landlock_find_rule(dom, id);
> -	access_request = landlock_init_layer_masks(
> -		dom, access_request, &layer_masks, LANDLOCK_KEY_NET_PORT);
> -	if (landlock_unmask_layers(rule, access_request, &layer_masks,
> -				   ARRAY_SIZE(layer_masks)))
> -		return 0;
> -
> -	return -EACCES;
> -}
> -
> -static int hook_socket_bind(struct socket *const sock,
> -			    struct sockaddr *const address, const int addrlen)
> -{
> -	__be16 port;
> -	struct sock *const sk = sock->sk;
> -	const struct landlock_ruleset *const dom = get_current_net_domain();
> -
> -	if (!dom)
> -		return 0;
> -	if (WARN_ON_ONCE(dom->num_layers < 1))
> -		return -EACCES;
> -
> -	if (sk_is_tcp(sk)) {
> -		/* Checks for minimal header length to safely read sa_family. */
> -		if (addrlen < offsetofend(typeof(*address), sa_family))
> -			return -EINVAL;
> -
> -		switch (address->sa_family) {
> -		case AF_UNSPEC:
> -		case AF_INET:
> -			if (addrlen < sizeof(struct sockaddr_in))
> -				return -EINVAL;
> -			port = ((struct sockaddr_in *)address)->sin_port;
> -			break;
> -
> -#if IS_ENABLED(CONFIG_IPV6)
> -		case AF_INET6:
> -			if (addrlen < SIN6_LEN_RFC2133)
> -				return -EINVAL;
> -			port = ((struct sockaddr_in6 *)address)->sin6_port;
> -			break;
> -#endif /* IS_ENABLED(CONFIG_IPV6) */
> -
> -		default:
> -			return 0;
> -		}
> -
> -		/*
> -		 * For compatibility reason, accept AF_UNSPEC for bind
> -		 * accesses (mapped to AF_INET) only if the address is
> -		 * INADDR_ANY (cf. __inet_bind).  Checking the address is
> -		 * required to not wrongfully return -EACCES instead of
> -		 * -EAFNOSUPPORT.
> -		 *
> -		 * We could return 0 and let the network stack handle these
> -		 * checks, but it is safer to return a proper error and test
> -		 * consistency thanks to kselftest.
> -		 */
> -		if (address->sa_family == AF_UNSPEC) {
> -			/* addrlen has already been checked for AF_UNSPEC. */
> -			const struct sockaddr_in *const sockaddr =
> -				(struct sockaddr_in *)address;
> -
> -			if (sk->sk_family != AF_INET)
> -				return -EINVAL;
> -
> -			if (sockaddr->sin_addr.s_addr != htonl(INADDR_ANY))
> -				return -EAFNOSUPPORT;
> -		} else {
> -			/*
> -			 * Checks sa_family consistency to not wrongfully return
> -			 * -EACCES instead of -EINVAL.  Valid sa_family changes are
> -			 * only (from AF_INET or AF_INET6) to AF_UNSPEC.
> -			 *
> -			 * We could return 0 and let the network stack handle this
> -			 * check, but it is safer to return a proper error and test
> -			 * consistency thanks to kselftest.
> -			 */
> -			if (address->sa_family != sk->sk_family)
> -				return -EINVAL;
> -		}
> -		return check_access_port(dom, port,
> -					 LANDLOCK_ACCESS_NET_BIND_TCP);
> -	}
> -	return 0;
> -}
> -
> -static int hook_socket_connect(struct socket *const sock,
> -			       struct sockaddr *const address,
> -			       const int addrlen)
> -{
> -	__be16 port;
> -	struct sock *const sk = sock->sk;
> -	const struct landlock_ruleset *const dom = get_current_net_domain();
> -
> -	if (!dom)
> -		return 0;
> -	if (WARN_ON_ONCE(dom->num_layers < 1))
> -		return -EACCES;
> -
> -	if (sk_is_tcp(sk)) {
> -		/* Checks for minimal header length to safely read sa_family. */
> -		if (addrlen < offsetofend(typeof(*address), sa_family))
> -			return -EINVAL;
> -
> -		switch (address->sa_family) {
> -		case AF_UNSPEC:
> -		case AF_INET:
> -			if (addrlen < sizeof(struct sockaddr_in))
> -				return -EINVAL;
> -			port = ((struct sockaddr_in *)address)->sin_port;
> -			break;
> -
> -#if IS_ENABLED(CONFIG_IPV6)
> -		case AF_INET6:
> -			if (addrlen < SIN6_LEN_RFC2133)
> -				return -EINVAL;
> -			port = ((struct sockaddr_in6 *)address)->sin6_port;
> -			break;
> -#endif /* IS_ENABLED(CONFIG_IPV6) */
> -
> -		default:
> -			return 0;
> -		}
> -
> -		/*
> -		 * Connecting to an address with AF_UNSPEC dissolves the TCP
> -		 * association, which have the same effect as closing the
> -		 * connection while retaining the socket object (i.e., the file
> -		 * descriptor).  As for dropping privileges, closing
> -		 * connections is always allowed.
> -		 *
> -		 * For a TCP access control system, this request is legitimate.
> -		 * Let the network stack handle potential inconsistencies and
> -		 * return -EINVAL if needed.
> -		 */
> -		if (address->sa_family == AF_UNSPEC)
> -			return 0;
> -		/*
> -		 * Checks sa_family consistency to not wrongfully return
> -		 * -EACCES instead of -EINVAL.  Valid sa_family changes are
> -		 * only (from AF_INET or AF_INET6) to AF_UNSPEC.
> -		 *
> -		 * We could return 0 and let the network stack handle this
> -		 * check, but it is safer to return a proper error and test
> -		 * consistency thanks to kselftest.
> -		 */
> -		if (address->sa_family != sk->sk_family)
> -			return -EINVAL;
> -
> -		return check_access_port(dom, port,
> -					 LANDLOCK_ACCESS_NET_CONNECT_TCP);
> -	}
> -	return 0;
> -}
> -
> -static struct security_hook_list landlock_hooks[] __ro_after_init = {
> -	LSM_HOOK_INIT(socket_bind, hook_socket_bind),
> -	LSM_HOOK_INIT(socket_connect, hook_socket_connect),
> -};
> -
> -__init void landlock_add_net_hooks(void)
> -{
> -	security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks),
> -			   &landlock_lsmid);
> -}
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Landlock LSM - Network management and hooks
> + *
> + * Copyright © 2022-2023 Huawei Tech. Co., Ltd.
> + * Copyright © 2022-2023 Microsoft Corporation
> + */
> +
> +#include <linux/in.h>
> +#include <linux/net.h>
> +#include <linux/socket.h>
> +#include <net/ipv6.h>
> +
> +#include "common.h"
> +#include "cred.h"
> +#include "limits.h"
> +#include "net.h"
> +#include "ruleset.h"
> +
> +int landlock_append_net_rule(struct landlock_ruleset *const ruleset,
> +			     const u16 port, access_mask_t access_rights)
> +{
> +	int err;
> +	const struct landlock_id id = {
> +		.key.data = (__force uintptr_t)htons(port),
> +		.type = LANDLOCK_KEY_NET_PORT,
> +	};
> +
> +	BUILD_BUG_ON(sizeof(port) > sizeof(id.key.data));
> +
> +	/* Transforms relative access rights to absolute ones. */
> +	access_rights |= LANDLOCK_MASK_ACCESS_NET &
> +			 ~landlock_get_net_access_mask(ruleset, 0);
> +
> +	mutex_lock(&ruleset->lock);
> +	err = landlock_insert_rule(ruleset, id, access_rights);
> +	mutex_unlock(&ruleset->lock);
> +
> +	return err;
> +}
> +
> +static const struct landlock_ruleset *get_current_net_domain(void)
> +{
> +	const union access_masks any_net = {
> +		.net = ~0,
> +	};
> +
> +	return landlock_match_ruleset(landlock_get_current_domain(), any_net);
> +}
> +
> +static int check_access_port(const struct landlock_ruleset *const dom,
> +			     __be16 port, access_mask_t access_request)
> +{
> +	layer_mask_t layer_masks[LANDLOCK_NUM_ACCESS_NET] = {};
> +	const struct landlock_rule *rule;
> +	struct landlock_id id = {
> +		.type = LANDLOCK_KEY_NET_PORT,
> +	};
> +
> +	id.key.data = (__force uintptr_t)port;
> +	BUILD_BUG_ON(sizeof(port) > sizeof(id.key.data));
> +
> +	rule = landlock_find_rule(dom, id);
> +	access_request = landlock_init_layer_masks(
> +		dom, access_request, &layer_masks, LANDLOCK_KEY_NET_PORT);
> +	if (landlock_unmask_layers(rule, access_request, &layer_masks,
> +				   ARRAY_SIZE(layer_masks)))
> +		return 0;
> +
> +	return -EACCES;
> +}
> +
> +/*
> + * Checks that TCP @sock and @address attributes are correct for bind(2).
> + *
> + * On success, extracts port from @address in @port and returns 0.
> + *
> + * This validation is consistent with network stack and returns the error
> + * in the order corresponding to the order of errors from the network stack.
> + * It's required to not wrongfully return -EACCES instead of meaningful network
> + * stack level errors. Consistency is tested with kselftest.
> + *
> + * This helper does not provide consistency of error codes for BPF filter
> + * (if any).
> + */
> +static int
> +check_tcp_bind_consistency_and_get_port(struct socket *const sock,
> +					struct sockaddr *const address,
> +					const int addrlen, __be16 *port)
> +{
> +	/* IPV6_ADDRFORM can change sk->sk_family under us. */
> +	switch (READ_ONCE(sock->sk->sk_family)) {
> +	case AF_INET:
> +		const struct sockaddr_in *const addr =
> +			(struct sockaddr_in *)address;
> +
> +		/* Cf. inet_bind_sk(). */
> +		if (addrlen < sizeof(struct sockaddr_in))
> +			return -EINVAL;
> +		/*
> +		 * For compatibility reason, accept AF_UNSPEC for bind
> +		 * accesses (mapped to AF_INET) only if the address is
> +		 * INADDR_ANY (cf. __inet_bind).
> +		 */
> +		if (addr->sin_family != AF_INET) {
> +			if (addr->sin_family != AF_UNSPEC ||
> +			    addr->sin_addr.s_addr != htonl(INADDR_ANY))
> +				return -EAFNOSUPPORT;
> +		}
> +		*port = ((struct sockaddr_in *)address)->sin_port;
> +		break;
> +#if IS_ENABLED(CONFIG_IPV6)
> +	case AF_INET6:
> +		/* Cf. inet6_bind_sk(). */
> +		if (addrlen < SIN6_LEN_RFC2133)
> +			return -EINVAL;
> +		/* Cf. __inet6_bind(). */
> +		if (address->sa_family != AF_INET6)
> +			return -EAFNOSUPPORT;
> +		*port = ((struct sockaddr_in6 *)address)->sin6_port;
> +		break;
> +#endif /* IS_ENABLED(CONFIG_IPV6) */
> +	default:
> +		WARN_ON_ONCE(0);
> +		return -EACCES;
> +	}
> +	return 0;
> +}
> +
> +/*
> + * Checks that TCP @sock and @address attributes are correct for connect(2).
> + *
> + * On success, extracts port from @address in @port and returns 0.
> + *
> + * This validation is consistent with network stack and returns the error
> + * in the order corresponding to the order of errors from the network stack.
> + * It's required to not wrongfully return -EACCES instead of meaningful network
> + * stack level error. Consistency is partially tested with kselftest.
> + *
> + * This helper does not provide consistency of error codes for BPF filter
> + * (if any).
> + *
> + * The function holds socket lock while checking the socket state.
> + */
> +static int
> +check_tcp_connect_consistency_and_get_port(struct socket *const sock,
> +					   struct sockaddr *const address,
> +					   const int addrlen, __be16 *port)
> +{
> +	int err = 0;
> +	struct sock *const sk = sock->sk;
> +
> +	/* Cf. __inet_stream_connect(). */
> +	lock_sock(sk);
> +	switch (sock->state) {
> +	default:
> +		err = -EINVAL;
> +		break;
> +	case SS_CONNECTED:
> +		err = -EISCONN;
> +		break;
> +	case SS_CONNECTING:
> +		/*
> +		 * Calling connect(2) on nonblocking socket with SYN_SENT or SYN_RECV
> +		 * state immediately returns -EISCONN and -EALREADY (Cf. __inet_stream_connect()).
> +		 *
> +		 * This check is not tested with kselftests.
> +		 */
> +		if ((sock->file->f_flags & O_NONBLOCK) &&
> +		    ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV))) {
> +			if (inet_test_bit(DEFER_CONNECT, sk))
> +				err = -EISCONN;
> +			else
> +				err = -EALREADY;
> +			break;
> +		}
> +
> +		/*
> +		 * Current state is possible in two cases:
> +		 * 1. connect(2) is called upon nonblocking socket and previous
> +		 *    connection attempt was closed by RST packet (therefore socket is
> +		 *    in TCP_CLOSE state). In this case connect(2) calls
> +		 *    sk_prot->disconnect(), changes socket state and increases number
> +		 *    of disconnects.
> +		 * 2. connect(2) is called twice upon socket with TCP_FASTOPEN_CONNECT
> +		 *    option set. If socket state is TCP_CLOSE connect(2) does the
> +		 *    same logic as in point 1 case. Otherwise connect(2) may freeze
> +		 *    after inet_wait_for_connect() call since SYN was never sent.
> +		 *
> +		 * For both this cases Landlock cannot provide error consistency since
> +		 * 1. Both cases involve executing some network stack logic and changing
> +		 *    the socket state.
> +		 * 2. It cannot omit access check and allow network stack handle error
> +		 *    consistency since socket can change its state to SS_UNCONNECTED
> +		 *    before it will be locked again in inet_stream_connect().
> +		 *
> +		 * Therefore it is only possible to return 0 and check access right with
> +		 * check_access_port() helper.
> +		 */
> +		release_sock(sk);
> +		return 0;
> +	case SS_UNCONNECTED:
> +		if (sk->sk_state != TCP_CLOSE)
> +			err = -EISCONN;
> +		break;
> +	}
> +	release_sock(sk);
> +
> +	if (err)
> +		return err;
> +
> +	/* IPV6_ADDRFORM can change sk->sk_family under us. */
> +	switch (READ_ONCE(sk->sk_family)) {
> +	case AF_INET:
> +		/* Cf. tcp_v4_connect(). */
> +		if (addrlen < sizeof(struct sockaddr_in))
> +			return -EINVAL;
> +		if (address->sa_family != AF_INET)
> +			return -EAFNOSUPPORT;
> +
> +		*port = ((struct sockaddr_in *)address)->sin_port;
> +		break;
> +#if IS_ENABLED(CONFIG_IPV6)
> +	case AF_INET6:
> +		/* Cf. tcp_v6_connect(). */
> +		if (addrlen < SIN6_LEN_RFC2133)
> +			return -EINVAL;
> +		if (address->sa_family != AF_INET6)
> +			return -EAFNOSUPPORT;
> +
> +		*port = ((struct sockaddr_in6 *)address)->sin6_port;
> +		break;
> +#endif /* IS_ENABLED(CONFIG_IPV6) */
> +	default:
> +		WARN_ON_ONCE(0);
> +		return -EACCES;
> +	}
> +
> +	return 0;
> +}
> +
> +static int hook_socket_bind(struct socket *const sock,
> +			    struct sockaddr *const address, const int addrlen)
> +{
> +	int err;
> +	__be16 port;
> +	const struct landlock_ruleset *const dom = get_current_net_domain();
> +
> +	if (!dom)
> +		return 0;
> +	if (WARN_ON_ONCE(dom->num_layers < 1))
> +		return -EACCES;
> +
> +	if (sk_is_tcp(sock->sk)) {
> +		err = check_tcp_bind_consistency_and_get_port(sock, address,
> +							      addrlen, &port);
> +		if (err)
> +			return err;
> +		return check_access_port(dom, port,
> +					 LANDLOCK_ACCESS_NET_BIND_TCP);
> +	}
> +	return 0;
> +}
> +
> +static int hook_socket_connect(struct socket *const sock,
> +			       struct sockaddr *const address,
> +			       const int addrlen)
> +{
> +	int err;
> +	__be16 port;
> +	const struct landlock_ruleset *const dom = get_current_net_domain();
> +
> +	if (!dom)
> +		return 0;
> +	if (WARN_ON_ONCE(dom->num_layers < 1))
> +		return -EACCES;
> +
> +	if (sk_is_tcp(sock->sk)) {
> +		/* Checks for minimal header length to safely read sa_family. */
> +		if (addrlen < sizeof(address->sa_family))
> +			return -EINVAL;
> +		/*
> +		 * Connecting to an address with AF_UNSPEC dissolves the TCP
> +		 * association, which have the same effect as closing the
> +		 * connection while retaining the socket object (i.e., the file
> +		 * descriptor).  As for dropping privileges, closing
> +		 * connections is always allowed.
> +		 *
> +		 * For a TCP access control system, this request is legitimate.
> +		 * Let the network stack handle potential inconsistencies and
> +		 * return -EINVAL if needed.
> +		 */
> +		if (address->sa_family == AF_UNSPEC)
> +			return 0;
> +
> +		err = check_tcp_connect_consistency_and_get_port(
> +			sock, address, addrlen, &port);
> +		if (err)
> +			return err;
> +		return check_access_port(dom, port,
> +					 LANDLOCK_ACCESS_NET_CONNECT_TCP);
> +	}
> +	return 0;
> +}
> +
> +static struct security_hook_list landlock_hooks[] __ro_after_init = {
> +	LSM_HOOK_INIT(socket_bind, hook_socket_bind),
> +	LSM_HOOK_INIT(socket_connect, hook_socket_connect),
> +};
> +
> +__init void landlock_add_net_hooks(void)
> +{
> +	security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks),
> +			   &landlock_lsmid);
> +}
> -- 
> 2.34.1
> 
> 

  parent reply	other threads:[~2024-12-04 19:32 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-17 11:04 [RFC PATCH v2 0/8] Fix non-TCP restriction and inconsistency of TCP errors Mikhail Ivanov
2024-10-17 11:04 ` [RFC PATCH v2 1/8] landlock: Fix non-TCP sockets restriction Mikhail Ivanov
2024-10-17 12:59   ` Matthieu Baerts
2024-10-18 18:08     ` Mickaël Salaün
2024-10-31 16:21       ` Mikhail Ivanov
2024-11-08 17:16         ` David Laight
2024-12-04 19:29           ` Mickaël Salaün
2024-12-12 18:43         ` Mickaël Salaün
2024-12-13 18:19           ` Mikhail Ivanov
2025-01-24 15:02             ` Mickaël Salaün
2025-01-27 12:40               ` Mikhail Ivanov
2025-01-27 19:48                 ` Mickaël Salaün
2025-01-28 10:56                   ` Mikhail Ivanov
2025-01-28 18:14                     ` Matthieu Baerts
2025-01-29  9:52                       ` Mikhail Ivanov
2025-01-29 10:25                         ` Matthieu Baerts
2025-01-29 11:02                           ` Mikhail Ivanov
2025-01-29 11:33                             ` Matthieu Baerts
2025-01-29 11:47                               ` Mikhail Ivanov
2025-01-29 11:57                                 ` Matthieu Baerts
2025-01-29 14:51                                 ` Mickaël Salaün
2025-01-29 15:44                                   ` Matthieu Baerts
2025-01-30  9:51                                     ` Mickaël Salaün
2025-01-30 10:18                                       ` Matthieu Baerts
2025-01-31 11:04                                   ` Mikhail Ivanov
2024-12-04 19:27       ` Mickaël Salaün
2024-12-04 19:35         ` Mickaël Salaün
2024-12-09 10:19           ` Mikhail Ivanov
2024-12-10 18:04             ` Mickaël Salaün
2024-12-10 18:05               ` Mickaël Salaün
2024-12-11 15:24                 ` Mikhail Ivanov
2024-12-12 18:43                   ` Mickaël Salaün
2024-12-13 11:42                     ` Mikhail Ivanov
2024-12-04 19:30   ` Mickaël Salaün
2024-12-09 10:19     ` Mikhail Ivanov
2024-10-17 11:04 ` [RFC PATCH v2 2/8] landlock: Make network stack layer checks explicit for each TCP action Mikhail Ivanov
2024-10-17 11:04 ` [RFC PATCH v2 3/8] landlock: Fix inconsistency of errors for TCP actions Mikhail Ivanov
2024-10-17 11:34   ` Mikhail Ivanov
2024-10-17 12:48   ` Tetsuo Handa
2024-11-06  9:27     ` Mikhail Ivanov
2024-10-20 15:45   ` kernel test robot
2024-12-04 19:32   ` Mickaël Salaün [this message]
2024-10-17 11:04 ` [RFC PATCH v2 4/8] selftests/landlock: Test TCP accesses with protocol=IPPROTO_TCP Mikhail Ivanov
2024-10-17 11:04 ` [RFC PATCH v2 5/8] selftests/landlock: Test that MPTCP actions are not restricted Mikhail Ivanov
2024-10-17 11:04 ` [RFC PATCH v2 6/8] selftests/landlock: Test consistency of errors for TCP actions Mikhail Ivanov
2024-12-10 18:07   ` Mickaël Salaün
2024-12-11 15:29     ` Mikhail Ivanov
2024-10-17 11:04 ` [RFC PATCH v2 7/8] landlock: Add note about errors consistency in documentation Mikhail Ivanov
2024-12-10 18:08   ` Mickaël Salaün
2024-12-11 15:30     ` Mikhail Ivanov
2024-10-17 11:04 ` [RFC PATCH v2 8/8] selftests/landlock: Test that SCTP actions are not restricted Mikhail Ivanov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241204.ibahfoo6thuG@digikod.net \
    --to=mic@digikod.net \
    --cc=artem.kuzin@huawei.com \
    --cc=gnoack@google.com \
    --cc=ivanov.mikhail1@huawei-partners.com \
    --cc=konstantin.meskhidze@huawei.com \
    --cc=linux-security-module@vger.kernel.org \
    --cc=matthieu@buffet.re \
    --cc=netdev@vger.kernel.org \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=willemdebruijn.kernel@gmail.com \
    --cc=yusongping@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.