Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3198612pxk; Mon, 21 Sep 2020 07:41:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwFxiwOntdZZmPkcrgg+SApfI402+Kpc67j4sp1wYHfaYAg44oUVrgQEM+9On5YK24+6Q9r X-Received: by 2002:aa7:dbcb:: with SMTP id v11mr52790379edt.351.1600699267977; Mon, 21 Sep 2020 07:41:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600699267; cv=none; d=google.com; s=arc-20160816; b=Zddf9U8IMLVFg0esZ0+q009jePT9AAbPp6TVCuVZ21CJ6f/OGFdKaN4m/8TPLT0QGF DW/Hkkisdc4tJ5WSAgy2zA7wVScVd+TcBwBsmuPi/nc0mGZ6zJTbCnwuuOSg/9HvHE8I UOw96ssMeToJoZ3ODyvR2dleNAyc2DDn+Jn+WdLjUNUbEurywstjnqGKv5s/NQh59pFY +yDr1pWheVsEgiHT4ENRY3VWA2INBAikNfJxlXFhdssM3EJWRNfgNfIwABs4FFJmKeX6 QyOWLy1B20MECbIj/98Pd2vZS5iBGfhQY/TixyV7k3KQR2QiYeDzt7UVzGU4039dJuD4 3Zeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=/qlLBmSLkXX8+VWho1l+4lvAqtyGS8XDHRWiRzbfdT0=; b=ucQQyZ5KOVJjpg9NMNiFdVFRWm5kv7fVs40I/YCzEJyo72+TaTQgKEJdu7IkW1gGW6 lB6cFvpGv4NdFjU1CBcfD6VA4WUsWXjnkWZyUUjeUvNHaIKhDW4o3rDX4T8QivZt0smJ ay2x67aes3txHmfOwqUrrbxcbO5PGri2WL+dDu0E3eQZYeQs3xbrWKb9Kx/6MrPjiYXk RJRPeNm7n3uQW8EleoEe5VTH489NF4YxwQRUlLOoXy1/7I+3EO6A+y/aYwYqUGIt5kdw o2ddwcgh1ZrmtsUumPEXl31A8+p9fR0A4OvI+VbPmQCoR3j/PITI8dtcXWrrXFj6NRND 155Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=Q001+qfE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=REJECT dis=NONE) header.from=arista.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bt16si8409095ejb.314.2020.09.21.07.40.43; Mon, 21 Sep 2020 07:41:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=Q001+qfE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=REJECT dis=NONE) header.from=arista.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727930AbgIUOhQ (ORCPT + 99 others); Mon, 21 Sep 2020 10:37:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42644 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727294AbgIUOhO (ORCPT ); Mon, 21 Sep 2020 10:37:14 -0400 Received: from mail-wr1-x443.google.com (mail-wr1-x443.google.com [IPv6:2a00:1450:4864:20::443]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 98344C0613D3 for ; Mon, 21 Sep 2020 07:37:12 -0700 (PDT) Received: by mail-wr1-x443.google.com with SMTP id j2so13030685wrx.7 for ; Mon, 21 Sep 2020 07:37:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=googlenew; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/qlLBmSLkXX8+VWho1l+4lvAqtyGS8XDHRWiRzbfdT0=; b=Q001+qfEfU11Y7UoINCguwe49yZ95OIa3Dtvsd2N+mQGKjbZp+DAbLebQLXtUGBb49 enuj+gcu0OkBdDGQJ83p0ylqjAoQOtC/YfSYOoQA3hD3KR37inUKZgW8tGJWT8yk+VeX q377TB41SenHuTgpNx44CFEnjNNqF3DzJpmwdl/7cr97Q33RBA3029gMF/qVl+LMNghR JGLjS0g1/v/YW3C3qHy4zL3LY80S9K/SbwQKNGYq1AIfUMMa/NtA/MiE+TlpDoS+N8/U vkeXJegOlczyOceUflvCrMaXksoMhSHVXE+n8PFYRn5FR0bNPWcl2W2vkHGTtS1/yvZV LhRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/qlLBmSLkXX8+VWho1l+4lvAqtyGS8XDHRWiRzbfdT0=; b=X2nlvpmJGeZRgupRTueXPpVS6eHEOVBPklXQjfAso7Car9utQcRrqp4aqm7v649Omt PAXejy40xFZw9aiiwUtl/ta9KszpDSN6r7egM7qk8APy74xwunMPUY/VdPVdLxuMNcx2 pwQqTvf+0d5UyO0r8VmFWIgtsMO3Iwo9p8QpuVDyGpNMypE3GkaJHySiIOnSKuyXwgqr PwVVzIv6IgEGaWnTnySfC3ecW5STo30a9BEQWQtbc+N+mVMPVYHGeBK36c7sqbhG/30Z Oi5Tuadir5fFITuKN1UxeDX9g5/pXIaQJrcz08A0/Mo81IAFFuF97aNtTjMvOzcU8afW 87TQ== X-Gm-Message-State: AOAM531Qv7L4DqHbC3rOG7HOx60UyseY/p4AQBlMF0NIl/IGEX0A2F5T qqelTz32P4YOLWfgzxsOw4rzwn5nb2ciWQ== X-Received: by 2002:a5d:4d51:: with SMTP id a17mr96505wru.248.1600699031023; Mon, 21 Sep 2020 07:37:11 -0700 (PDT) Received: from localhost.localdomain ([2a02:8084:e84:2480:228:f8ff:fe6f:83a8]) by smtp.gmail.com with ESMTPSA id c14sm20370753wrv.12.2020.09.21.07.37.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 07:37:10 -0700 (PDT) From: Dmitry Safonov To: linux-kernel@vger.kernel.org Cc: Dmitry Safonov <0x7f454c46@gmail.com>, Dmitry Safonov , "David S. Miller" , Florian Westphal , Herbert Xu , Jakub Kicinski , Johannes Berg , Steffen Klassert , Stephen Suryaputra , netdev@vger.kernel.org Subject: [PATCH v3 4/7] netlink/compat: Append NLMSG_DONE/extack to frag_list Date: Mon, 21 Sep 2020 15:36:54 +0100 Message-Id: <20200921143657.604020-5-dima@arista.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200921143657.604020-1-dima@arista.com> References: <20200921143657.604020-1-dima@arista.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Modules those use netlink may supply a 2nd skb, (via frag_list) that contains an alternative data set meant for applications using 32bit compatibility mode. In such a case, netlink_recvmsg will use this 2nd skb instead of the original one. Without this patch, such compat applications will retrieve all netlink dump data, but will then get an unexpected EOF. Cc: Johannes Berg Signed-off-by: Florian Westphal Signed-off-by: Dmitry Safonov Reviewed-by: Johannes Berg --- net/netlink/af_netlink.c | 47 ++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index d2d1448274f5..de12dd3136f9 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -2186,13 +2186,35 @@ EXPORT_SYMBOL(__nlmsg_put); * It would be better to create kernel thread. */ +static int netlink_dump_done(struct netlink_sock *nlk, struct sk_buff *skb, + struct netlink_callback *cb, + struct netlink_ext_ack *extack) +{ + struct nlmsghdr *nlh; + + nlh = nlmsg_put_answer(skb, cb, NLMSG_DONE, sizeof(nlk->dump_done_errno), + NLM_F_MULTI | cb->answer_flags); + if (WARN_ON(!nlh)) + return -ENOBUFS; + + nl_dump_check_consistent(cb, nlh); + memcpy(nlmsg_data(nlh), &nlk->dump_done_errno, sizeof(nlk->dump_done_errno)); + + if (extack->_msg && nlk->flags & NETLINK_F_EXT_ACK) { + nlh->nlmsg_flags |= NLM_F_ACK_TLVS; + if (!nla_put_string(skb, NLMSGERR_ATTR_MSG, extack->_msg)) + nlmsg_end(skb, nlh); + } + + return 0; +} + static int netlink_dump(struct sock *sk) { struct netlink_sock *nlk = nlk_sk(sk); struct netlink_ext_ack extack = {}; struct netlink_callback *cb; struct sk_buff *skb = NULL; - struct nlmsghdr *nlh; struct module *module; int err = -ENOBUFS; int alloc_min_size; @@ -2258,22 +2280,19 @@ static int netlink_dump(struct sock *sk) return 0; } - nlh = nlmsg_put_answer(skb, cb, NLMSG_DONE, - sizeof(nlk->dump_done_errno), - NLM_F_MULTI | cb->answer_flags); - if (WARN_ON(!nlh)) + if (netlink_dump_done(nlk, skb, cb, &extack)) goto errout_skb; - nl_dump_check_consistent(cb, nlh); - - memcpy(nlmsg_data(nlh), &nlk->dump_done_errno, - sizeof(nlk->dump_done_errno)); - - if (extack._msg && nlk->flags & NETLINK_F_EXT_ACK) { - nlh->nlmsg_flags |= NLM_F_ACK_TLVS; - if (!nla_put_string(skb, NLMSGERR_ATTR_MSG, extack._msg)) - nlmsg_end(skb, nlh); +#ifdef CONFIG_COMPAT_NETLINK_MESSAGES + /* frag_list skb's data is used for compat tasks + * and the regular skb's data for normal (non-compat) tasks. + * See netlink_recvmsg(). + */ + if (unlikely(skb_shinfo(skb)->frag_list)) { + if (netlink_dump_done(nlk, skb_shinfo(skb)->frag_list, cb, &extack)) + goto errout_skb; } +#endif if (sk_filter(sk, skb)) kfree_skb(skb); -- 2.28.0