Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3197232pxk; Mon, 21 Sep 2020 07:39:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxjqzNAeMBUdMFUdQBiVwmGghgkjSJYMH9PjIo3dIgAFO/nZzEYQp0TE3nuOlqDG/r6+KYO X-Received: by 2002:a05:6402:b72:: with SMTP id cb18mr51310131edb.299.1600699151297; Mon, 21 Sep 2020 07:39:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600699151; cv=none; d=google.com; s=arc-20160816; b=n8DnX1LGebU5nkkjEGYly8JzQXYSCOptWbcZyi13JU2UBPHdZmFEbJetW8KLKZYY1v ZQjCfnLFn7tD+Ie1LHea1b1cGH8HMZD0RZgzOOtVUltWDPcCAOBBpi7GKfILkdebYsEQ LqlC12tHhPf4YSwLizPf5rIi0e4O0X7RwxDbNNAhebinEI8Th/wb2pwB+KNLaJ6nAWa7 Oe2FUiLtDNlWK8Y/a9lpk7MX5ajgQlmh4cv7gqDJezsfIHslIuervSFBQ5Silk0iaAkl plynn3wZ5gYqRcTQupM+f5Z+szOj6tFYe1ycuOBbIF5sfInhb1yx76MiErFUT59izmEg H17Q== 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=wnvbdIKWJ6AAgCFtsSP8IkBiUqWqGAGPpu4/dd+164E=; b=fZOwGB4paFcQoLl2Hs8aNkNxpGfIxIQpI1SKFjMfn1+d9mOFQI6eYmc/7kmhzSay0F qdfcKrHPaQnCML9L19hZok5skNCIj2pCAHgCjReFcHcFPl/LLYU+rV4S1qnPucxA+gDZ ibvnpshwQ6T5KNDRmf6lSBsX852arC51SijYlPr+rorrutAuxzSCxVUgrhgIOvDkDb7O BLcLedWAVz31So8obvstV/17smm1bcQRxZiTMy72TXp/VATYemkJkMzHVmAQg/bASPne OotIPkeHSkXp1kCvunXiUCnXKVNeBmWljChsJAl+S8J0z2+Qa+w6um2n3ziEWVxXVQPM 0fCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=AFmSSoOq; 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 v21si9329091ejg.582.2020.09.21.07.38.47; Mon, 21 Sep 2020 07:39:11 -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=AFmSSoOq; 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 S1727916AbgIUOhP (ORCPT + 99 others); Mon, 21 Sep 2020 10:37:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727219AbgIUOhL (ORCPT ); Mon, 21 Sep 2020 10:37:11 -0400 Received: from mail-wm1-x343.google.com (mail-wm1-x343.google.com [IPv6:2a00:1450:4864:20::343]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 63175C0613D1 for ; Mon, 21 Sep 2020 07:37:11 -0700 (PDT) Received: by mail-wm1-x343.google.com with SMTP id s13so12366857wmh.4 for ; Mon, 21 Sep 2020 07:37:11 -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=wnvbdIKWJ6AAgCFtsSP8IkBiUqWqGAGPpu4/dd+164E=; b=AFmSSoOqtOuxCv0wZpi+kLpYjxEcU/FEIwJTY+nhtwHw1LjMwY1yGTnkOYNHPR048M WSSbQu62SBcXmujLhNjCbyWFneDtDC01b8xLleyumamT0XN3zf5QDaaQtVZJAiLEHl+K aP1KnBtqSVmfJR7WhnaqRvbNKYw2qal7p9quGtvVJ7RdyHtmWfReMq8u0hFRYtgcLtE5 iJ/wsSLKLQSFTB08PvT25vypOAiLCIXjNqXokcw5UQN/kaByfzSrpI7nNMD26Fjf7xYs jIEvzQIzGPZf3zf9swZkmLfN9PK811LL2AIEI8sQr+XGJGvP8S81SVDCpJIBVmBcjEYC h8jw== 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=wnvbdIKWJ6AAgCFtsSP8IkBiUqWqGAGPpu4/dd+164E=; b=qoHGcQcBLT17F2m+HkYxc1d2ehp+Acp3B9wpe41Uqvl3SHfJOTmfmLi5rnio3dLfZA DXngnC2fSo+Nd+WAHEcqHKMTvqMKAl7P129D8WZmWg95az2B1B6zxUoOuwXrrAmOAGvO oFz3TPRufSir2A6jAawxewUBFmR2VuamuYAVmSiDb4Z65NVUYEr96uZsXMIlA2t3oRcX z+oCXsNGtAxwP+hKjgGZnjGMy+0DwhmH72+87+bCQiNjqGeNhDXxBUmhaEZsY6Mqmrxi zeZirAkAd3m6BWQMwtIURZ0kob9xvy+i2wBMKZv/uf3i6hUZGw7x9TzQJ0muSGxsaOOx XFTQ== X-Gm-Message-State: AOAM531v4WswMzXTKrve03UGmu9kzJLdmi8J65uG1q2JLt8Sn4Kqbfvk M/LNT4kIWsN8xLGR8idD2HsnIiI1mmDd3A== X-Received: by 2002:a05:600c:4142:: with SMTP id h2mr194666wmm.128.1600699029830; Mon, 21 Sep 2020 07:37:09 -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.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 07:37:03 -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 3/7] xfrm/compat: Attach xfrm dumps to 64=>32 bit translator Date: Mon, 21 Sep 2020 15:36:53 +0100 Message-Id: <20200921143657.604020-4-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 Currently nlmsg_unicast() is used by functions that dump structures that can be different in size for compat tasks, see dump_one_state() and dump_one_policy(). The following nlmsg_unicast() users exist today in xfrm: Function | Message can be different | in size on compat -------------------------------------------|------------------------------ xfrm_get_spdinfo() | N xfrm_get_sadinfo() | N xfrm_get_sa() | Y xfrm_alloc_userspi() | Y xfrm_get_policy() | Y xfrm_get_ae() | N Besides, dump_one_state() and dump_one_policy() can be used by filtered netlink dump for XFRM_MSG_GETSA, XFRM_MSG_GETPOLICY. Just as for xfrm multicast, allocate frag_list for compat skb journey down to recvmsg() which will give user the desired skb according to syscall bitness. Signed-off-by: Dmitry Safonov --- net/xfrm/xfrm_user.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 3769227ed4e1..7fd7b16a8805 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -975,6 +975,7 @@ static int dump_one_state(struct xfrm_state *x, int count, void *ptr) struct xfrm_dump_info *sp = ptr; struct sk_buff *in_skb = sp->in_skb; struct sk_buff *skb = sp->out_skb; + struct xfrm_translator *xtr; struct xfrm_usersa_info *p; struct nlmsghdr *nlh; int err; @@ -992,6 +993,18 @@ static int dump_one_state(struct xfrm_state *x, int count, void *ptr) return err; } nlmsg_end(skb, nlh); + + xtr = xfrm_get_translator(); + if (xtr) { + err = xtr->alloc_compat(skb, nlh); + + xfrm_put_translator(xtr); + if (err) { + nlmsg_cancel(skb, nlh); + return err; + } + } + return 0; } @@ -1320,6 +1333,7 @@ static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh, struct net *net = sock_net(skb->sk); struct xfrm_state *x; struct xfrm_userspi_info *p; + struct xfrm_translator *xtr; struct sk_buff *resp_skb; xfrm_address_t *daddr; int family; @@ -1370,6 +1384,17 @@ static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh, goto out; } + xtr = xfrm_get_translator(); + if (xtr) { + err = xtr->alloc_compat(skb, nlmsg_hdr(skb)); + + xfrm_put_translator(xtr); + if (err) { + kfree_skb(resp_skb); + goto out; + } + } + err = nlmsg_unicast(net->xfrm.nlsk, resp_skb, NETLINK_CB(skb).portid); out: @@ -1776,6 +1801,7 @@ static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr struct xfrm_userpolicy_info *p; struct sk_buff *in_skb = sp->in_skb; struct sk_buff *skb = sp->out_skb; + struct xfrm_translator *xtr; struct nlmsghdr *nlh; int err; @@ -1800,6 +1826,18 @@ static int dump_one_policy(struct xfrm_policy *xp, int dir, int count, void *ptr return err; } nlmsg_end(skb, nlh); + + xtr = xfrm_get_translator(); + if (xtr) { + err = xtr->alloc_compat(skb, nlh); + + xfrm_put_translator(xtr); + if (err) { + nlmsg_cancel(skb, nlh); + return err; + } + } + return 0; } -- 2.28.0