Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp3325714pxa; Tue, 25 Aug 2020 18:55:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKQTaS9ZodtIjgr2+AwTzcxAb7tG8xsC15wu/udb0oPZrcllT0jWSwOTqe4NvhvSoNc9Q6 X-Received: by 2002:aa7:cd6c:: with SMTP id ca12mr12517813edb.365.1598406909308; Tue, 25 Aug 2020 18:55:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598406909; cv=none; d=google.com; s=arc-20160816; b=Z0FHg5yfquXN20Z6Usv2uvnuJpUKjklEW0dVu3jkx8AM+I7nrB93t0eGW03GffccXV BoElUCX4T6Xj5cySfpv1kIMzFwjXA3cPrYp3UavnOE1x+xJoUJHnPuet3URaNsJsTV7U 0cisj51ez9+LuriEi8BzDGzxqotvwq5x3cTTuBgJCiY85VUm147dO8sexGNK5cvEzPF7 DBHpKYwEQQeWO5M3EVJFptRA0dnJW5g0cXJFSNSoZytw2PEs3S5hS9fqj1LuNN+c1CK0 WlYx/u9H+ec10Wnz6Akv+7jwhg+2zcMfWYKFV6CRnSj53L/9uzrZ+xDyECk3p8DIXDPf vwpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=p4z/80YMT7r/2XPt+q1H560KQo/33xQgEXp21sNkmO4=; b=NbmupWOvux1BTBBkReJg3DMC73LIQe5++lHNpK27IQAIL45Seyl1rehdfyNOnmIqRc YjkHDbHJSmzSD4Z7vcFnhKVQjNEhmQ4VzAYFRVThnnugfqBdeVK4a6ODKJDn/g0vUz7O oFetjHCliOh2HCN6qDkxdHZvwt32SpeHZhzlgKNO85iNHoyOqNXO/GQd/gWgrtmItaJa YTWvZUShGW/Tlg+8KKSggijhKmYvsnv3b4r8HAxdrQz5fBMyiFJqTL23xlCWAqkpH9+1 +zBDJEoEEU9EJtwBe4BF1+9gjrvnfwU1wqHRZDbUVnzt/omugX9quKbs/MpGKPrp5k8d 7mow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=pJhf4HaY; 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 gy3si584231ejb.268.2020.08.25.18.54.46; Tue, 25 Aug 2020 18:55:09 -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=pJhf4HaY; 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 S1726864AbgHZBur (ORCPT + 99 others); Tue, 25 Aug 2020 21:50:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54212 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726820AbgHZBt4 (ORCPT ); Tue, 25 Aug 2020 21:49:56 -0400 Received: from mail-wr1-x442.google.com (mail-wr1-x442.google.com [IPv6:2a00:1450:4864:20::442]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D45CC061757 for ; Tue, 25 Aug 2020 18:49:56 -0700 (PDT) Received: by mail-wr1-x442.google.com with SMTP id b17so174341wru.2 for ; Tue, 25 Aug 2020 18:49:56 -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=p4z/80YMT7r/2XPt+q1H560KQo/33xQgEXp21sNkmO4=; b=pJhf4HaYxbpq0Az8ZRTtZewR7KRrnMlpRJJoVod4OUsQFPPO6h94qY2T7lCXbJnc2J rOc9KDyeB5iL735kUZS7QLrwf2/gjG6msLAUUOsGFDmcayGsXM+3En+n++2Er7TUdozq pjztsU65wqrb7nPJGhk8yJINiN+yF+ygjNSUgwXe0292sGzHwsKhhJaxFFkIxVwTGbpg zyKGGrPADDRZUr88pEKElho+Zk+F7chW+zFHVQKG6jsQHIZhom1X/t++zZkWF99rLdMQ 98Aw6iziI/KubH6D91LkfdGDT0FzsZiSv3H7O+idoIAWIL5dNz4c8QmAouazotBBITtb zU3A== 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=p4z/80YMT7r/2XPt+q1H560KQo/33xQgEXp21sNkmO4=; b=O1cFuOl6VD4SkzoBXg36Q+u1dbWQdiFnivZz/nJJ3Vm0UB2gA9GoOrCav3aq12hL67 cImBsOQcfPWGmONFT1+SH4cJ5T/hwJ8ErFRq7yUhMZmcfz1sBc4xuwU3V/YyJJ84YY4O VHNmLL/0B2GjA8g+ipk6VM7JpQzL/bTjI7Watw6HQBVxQBq6+tjqcmjmu/ARxwWfSiyg RyajbZ0W744RAnqHN7s/ddpPw5q8DGfvi+ddrNs2KnND5tpOa8jY+xT/tGAPgX3VqieH 042UrI44wqYan3572RRyI3NhtOXyeRQa9G/Y5mv1xISWLHCs/g3ysOumbz44caPq4VKd 0JdA== X-Gm-Message-State: AOAM531G2WnEIQNcnGD5qn8EM1MFzfZ1PbIAFfbfHAAR7KKCE3jKQlB/ sxntKI3yCiQ110KLXOoABw75ByJa0Z9SuVyOCUk= X-Received: by 2002:adf:9ec5:: with SMTP id b5mr12277714wrf.190.1598406594695; Tue, 25 Aug 2020 18:49:54 -0700 (PDT) Received: from localhost.localdomain ([2a02:8084:e84:2480:228:f8ff:fe6f:83a8]) by smtp.gmail.com with ESMTPSA id c10sm1263661wmk.30.2020.08.25.18.49.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Aug 2020 18:49:54 -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 , Steffen Klassert , Stephen Suryaputra , netdev@vger.kernel.org, Johannes Berg Subject: [PATCH v2 3/6] netlink/compat: Append NLMSG_DONE/extack to frag_list Date: Wed, 26 Aug 2020 02:49:46 +0100 Message-Id: <20200826014949.644441-4-dima@arista.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200826014949.644441-1-dima@arista.com> References: <20200826014949.644441-1-dima@arista.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org 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 --- net/netlink/af_netlink.c | 48 ++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index b5f30d7d30d0..b096f2b4a50d 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -2186,13 +2186,36 @@ 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 +2281,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.27.0