Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp287620pxj; Tue, 18 May 2021 03:29:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx/xXctC6vM1ruu0XFxgZtzb72xoWmdO7b8Jk5uv/ggBODLZh1b7cwR3ZSSLdB5ym9pVhOC X-Received: by 2002:a05:6402:2793:: with SMTP id b19mr88421ede.191.1621333753137; Tue, 18 May 2021 03:29:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621333753; cv=none; d=google.com; s=arc-20160816; b=r3LcRPgpYiyBeC/VchwK9comRZHM0HyMK25kJ+OZv07lT/6W4C4KE300Brtht3JZN8 YHMUEpRhcGkJ5NG6xCNkpOPGJfSztSD/9P57s4HIfq6qLsgytUXsrVrAnyxppg4Iuk32 1z3Og306v5N1f/aWNCeHP1BWEpryfN76SeqfCI8wFP277mnHa468Q9k/KF3nKskkwG3I MAIzT47Y03kCJF5nDzHHz0k1B8GhyQCOWMP80bfe1MX+OoUoe6Stl9vA8r6aohBrSIGj uzh+N7+LUK/3z1AgvJ2vSDwtJmCgdycIPpiVfV/tT/mTRSZO7A65WUNEA+ebiBG06NrD cLQg== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=YzC9lOekpE2cQ+mfnePp8NXU6Cp/nqeaSgHEKplIDr0=; b=P5KR3cZzdKTUtZ5JlBqlTDN3gNmc6IDiXj7hfM5DCJK0UPpEIcU/NnxIco6NSjzOpU +0pjC0aKTdTYm3c7YUFc/fj350zBDouFvcGcVyIKKb5UzC93MyUS8i4wHMN8K4PoSGqn OXuUy5zx9y1QtUcFJVNUrChP0T0ch8PDJSK2fNG/+yQGXlgvM063iKEEM4ZFKwFSE6zX i8TSk/Vkm4a10XHS6xjP9ccAXoZSf7f18aPbTrtV3+HOeVTwVgZSGHlX+d8hJV7dl41Q zSlO79+IzW9GDBgfQNC8kTjPERBLN5zOmDuGmZ94FrBPk8LcHd1rq6SII6CCxBLCPM6S CVqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=gjS+cqaq; 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=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cr15si3826810ejc.676.2021.05.18.03.28.47; Tue, 18 May 2021 03:29:13 -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=@linuxfoundation.org header.s=korg header.b=gjS+cqaq; 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=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243497AbhEQPOO (ORCPT + 99 others); Mon, 17 May 2021 11:14:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:45118 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242583AbhEQPD6 (ORCPT ); Mon, 17 May 2021 11:03:58 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8513E61A36; Mon, 17 May 2021 14:28:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1621261691; bh=Od8mqaHbDMNP+qvydvXCn6RWZXbN2zPX6QAUaqVVZqE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gjS+cqaqilYrW442noTV/NIYZdBBBX2fVyfJnxnl9zTlrt2npHH1hkFoK8M06G2k2 2DTFaOm74lR180+z8eDS9B+dOCYvZ6Ie8cR5Lu0LEyotAF2JZa7sHSTHZzBawA5xkV ZWuYrCvvFXnw55Vf3S4RE0+HfOfV/rRmUmMQf4yo= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Phil Sutter , Pablo Neira Ayuso , Sasha Levin Subject: [PATCH 5.4 077/141] netfilter: xt_SECMARK: add new revision to fix structure layout Date: Mon, 17 May 2021 16:02:09 +0200 Message-Id: <20210517140245.382169432@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210517140242.729269392@linuxfoundation.org> References: <20210517140242.729269392@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Pablo Neira Ayuso [ Upstream commit c7d13358b6a2f49f81a34aa323a2d0878a0532a2 ] This extension breaks when trying to delete rules, add a new revision to fix this. Fixes: 5e6874cdb8de ("[SECMARK]: Add xtables SECMARK target") Signed-off-by: Phil Sutter Signed-off-by: Pablo Neira Ayuso Signed-off-by: Sasha Levin --- include/uapi/linux/netfilter/xt_SECMARK.h | 6 ++ net/netfilter/xt_SECMARK.c | 88 ++++++++++++++++++----- 2 files changed, 75 insertions(+), 19 deletions(-) diff --git a/include/uapi/linux/netfilter/xt_SECMARK.h b/include/uapi/linux/netfilter/xt_SECMARK.h index 1f2a708413f5..beb2cadba8a9 100644 --- a/include/uapi/linux/netfilter/xt_SECMARK.h +++ b/include/uapi/linux/netfilter/xt_SECMARK.h @@ -20,4 +20,10 @@ struct xt_secmark_target_info { char secctx[SECMARK_SECCTX_MAX]; }; +struct xt_secmark_target_info_v1 { + __u8 mode; + char secctx[SECMARK_SECCTX_MAX]; + __u32 secid; +}; + #endif /*_XT_SECMARK_H_target */ diff --git a/net/netfilter/xt_SECMARK.c b/net/netfilter/xt_SECMARK.c index 2317721f3ecb..ea7aeea19b3b 100644 --- a/net/netfilter/xt_SECMARK.c +++ b/net/netfilter/xt_SECMARK.c @@ -26,10 +26,9 @@ MODULE_ALIAS("ip6t_SECMARK"); static u8 mode; static unsigned int -secmark_tg(struct sk_buff *skb, const struct xt_action_param *par) +secmark_tg(struct sk_buff *skb, const struct xt_secmark_target_info_v1 *info) { u32 secmark = 0; - const struct xt_secmark_target_info *info = par->targinfo; switch (mode) { case SECMARK_MODE_SEL: @@ -43,7 +42,7 @@ secmark_tg(struct sk_buff *skb, const struct xt_action_param *par) return XT_CONTINUE; } -static int checkentry_lsm(struct xt_secmark_target_info *info) +static int checkentry_lsm(struct xt_secmark_target_info_v1 *info) { int err; @@ -75,15 +74,15 @@ static int checkentry_lsm(struct xt_secmark_target_info *info) return 0; } -static int secmark_tg_check(const struct xt_tgchk_param *par) +static int +secmark_tg_check(const char *table, struct xt_secmark_target_info_v1 *info) { - struct xt_secmark_target_info *info = par->targinfo; int err; - if (strcmp(par->table, "mangle") != 0 && - strcmp(par->table, "security") != 0) { + if (strcmp(table, "mangle") != 0 && + strcmp(table, "security") != 0) { pr_info_ratelimited("only valid in \'mangle\' or \'security\' table, not \'%s\'\n", - par->table); + table); return -EINVAL; } @@ -118,25 +117,76 @@ static void secmark_tg_destroy(const struct xt_tgdtor_param *par) } } -static struct xt_target secmark_tg_reg __read_mostly = { - .name = "SECMARK", - .revision = 0, - .family = NFPROTO_UNSPEC, - .checkentry = secmark_tg_check, - .destroy = secmark_tg_destroy, - .target = secmark_tg, - .targetsize = sizeof(struct xt_secmark_target_info), - .me = THIS_MODULE, +static int secmark_tg_check_v0(const struct xt_tgchk_param *par) +{ + struct xt_secmark_target_info *info = par->targinfo; + struct xt_secmark_target_info_v1 newinfo = { + .mode = info->mode, + }; + int ret; + + memcpy(newinfo.secctx, info->secctx, SECMARK_SECCTX_MAX); + + ret = secmark_tg_check(par->table, &newinfo); + info->secid = newinfo.secid; + + return ret; +} + +static unsigned int +secmark_tg_v0(struct sk_buff *skb, const struct xt_action_param *par) +{ + const struct xt_secmark_target_info *info = par->targinfo; + struct xt_secmark_target_info_v1 newinfo = { + .secid = info->secid, + }; + + return secmark_tg(skb, &newinfo); +} + +static int secmark_tg_check_v1(const struct xt_tgchk_param *par) +{ + return secmark_tg_check(par->table, par->targinfo); +} + +static unsigned int +secmark_tg_v1(struct sk_buff *skb, const struct xt_action_param *par) +{ + return secmark_tg(skb, par->targinfo); +} + +static struct xt_target secmark_tg_reg[] __read_mostly = { + { + .name = "SECMARK", + .revision = 0, + .family = NFPROTO_UNSPEC, + .checkentry = secmark_tg_check_v0, + .destroy = secmark_tg_destroy, + .target = secmark_tg_v0, + .targetsize = sizeof(struct xt_secmark_target_info), + .me = THIS_MODULE, + }, + { + .name = "SECMARK", + .revision = 1, + .family = NFPROTO_UNSPEC, + .checkentry = secmark_tg_check_v1, + .destroy = secmark_tg_destroy, + .target = secmark_tg_v1, + .targetsize = sizeof(struct xt_secmark_target_info_v1), + .usersize = offsetof(struct xt_secmark_target_info_v1, secid), + .me = THIS_MODULE, + }, }; static int __init secmark_tg_init(void) { - return xt_register_target(&secmark_tg_reg); + return xt_register_targets(secmark_tg_reg, ARRAY_SIZE(secmark_tg_reg)); } static void __exit secmark_tg_exit(void) { - xt_unregister_target(&secmark_tg_reg); + xt_unregister_targets(secmark_tg_reg, ARRAY_SIZE(secmark_tg_reg)); } module_init(secmark_tg_init); -- 2.30.2