[Devel] [PATCH RH7] netlink: add an option to set sk->err from userspace

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Wed Oct 28 18:15:59 MSK 2020


Nice!

Do we need to protect it with some kind of capable? So that one can't 
use it from container. (probably repair mode is already a valid 
protection but please check to be sure)

On 10/28/20 5:59 PM, Andrey Zhadchenko wrote:
> Sometimes during dump criu can encounter netlink sockets with overflown kernel
> buffer, which results in ENOBUFS error during next read. We need an reliable
> way to restore sk->sk_err.
> 
> https://jira.sw.ru/browse/PSBM-120976
> Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
> ---
>   include/uapi/linux/netlink.h | 1 +
>   net/netlink/af_netlink.c     | 8 ++++++++
>   2 files changed, 9 insertions(+)
> 
> diff --git a/include/uapi/linux/netlink.h b/include/uapi/linux/netlink.h
> index 3756be5..62f8b4b 100644
> --- a/include/uapi/linux/netlink.h
> +++ b/include/uapi/linux/netlink.h
> @@ -115,6 +115,7 @@ struct nlmsgerr {
>   #define NETLINK_CAP_ACK		10
>   
>   #define NETLINK_REPAIR2		127
> +#define NETLINK_SETERR		128
>   
>   struct nl_pktinfo {
>   	__u32	group;
> diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
> index 7b3de33..104045e 100644
> --- a/net/netlink/af_netlink.c
> +++ b/net/netlink/af_netlink.c
> @@ -1535,6 +1535,14 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname,
>   			nlk->flags &= ~NETLINK_F_REPAIR;
>   		err = 0;
>   		break;
> +	case NETLINK_SETERR:
> +		err = -ENOPROTOOPT;
> +		if (nlk->flags & NETLINK_F_REPAIR && val < MAX_ERRNO) { > +			sk->sk_err = val;
> +			sk->sk_error_report(sk);
> +			err = 0; > +		}
> +		break;
>   	case NETLINK_PKTINFO:
>   		if (val)
>   			nlk->flags |= NETLINK_F_RECV_PKTINFO;
> 

-- 
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.


More information about the Devel mailing list