netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] netlink: add NLA_REJECT policy type
@ 2018-09-13  8:46 Johannes Berg
  2018-09-13  8:46 ` [PATCH 2/2] netlink: add ethernet address policy types Johannes Berg
                   ` (3 more replies)
  0 siblings, 4 replies; 30+ messages in thread
From: Johannes Berg @ 2018-09-13  8:46 UTC (permalink / raw)
  To: linux-wireless-u79uwXL29TY76Z2rM5mHXA,
	netdev-u79uwXL29TY76Z2rM5mHXA
  Cc: Michal Kubecek, Johannes Berg

From: Johannes Berg <johannes.berg-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

In some situations some netlink attributes may be used for output
only (kernel->userspace) or may be reserved for future use. It's
then helpful to be able to prevent userspace from using them in
messages sent to the kernel, since they'd otherwise be ignored and
any future will become impossible if this happens.

Add NLA_REJECT to the policy which does nothing but reject (with
EINVAL) validation of any messages containing this attribute.
Allow for returning a specific extended ACK error message in the
validation_data pointer.

While at it fix the indentation of NLA_BITFIELD32 and describe the
validation_data pointer for it.

The specific case I have in mind now is a shared nested attribute
containing request/response data, and it would be pointless and
potentially confusing to have userspace include response data in
the messages that actually contain a request.

Signed-off-by: Johannes Berg <johannes.berg-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 include/net/netlink.h |  6 +++++-
 lib/nlattr.c          | 22 +++++++++++++++-------
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/include/net/netlink.h b/include/net/netlink.h
index 0c154f98e987..04e40fcc70d6 100644
--- a/include/net/netlink.h
+++ b/include/net/netlink.h
@@ -180,6 +180,7 @@ enum {
 	NLA_S32,
 	NLA_S64,
 	NLA_BITFIELD32,
+	NLA_REJECT,
 	__NLA_TYPE_MAX,
 };
 
@@ -208,7 +209,10 @@ enum {
  *    NLA_MSECS            Leaving the length field zero will verify the
  *                         given type fits, using it verifies minimum length
  *                         just like "All other"
- *    NLA_BITFIELD32      A 32-bit bitmap/bitselector attribute
+ *    NLA_BITFIELD32       A 32-bit bitmap/bitselector attribute, validation
+ *                         data must point to a u32 value of valid flags
+ *    NLA_REJECT           Reject this attribute, validation data may point
+ *                         to a string to report as the error in extended ACK.
  *    All other            Minimum length of attribute payload
  *
  * Example:
diff --git a/lib/nlattr.c b/lib/nlattr.c
index e335bcafa9e4..56e0aae5cf23 100644
--- a/lib/nlattr.c
+++ b/lib/nlattr.c
@@ -69,7 +69,8 @@ static int validate_nla_bitfield32(const struct nlattr *nla,
 }
 
 static int validate_nla(const struct nlattr *nla, int maxtype,
-			const struct nla_policy *policy)
+			const struct nla_policy *policy,
+			struct netlink_ext_ack *extack)
 {
 	const struct nla_policy *pt;
 	int minlen = 0, attrlen = nla_len(nla), type = nla_type(nla);
@@ -87,6 +88,11 @@ static int validate_nla(const struct nlattr *nla, int maxtype,
 	}
 
 	switch (pt->type) {
+	case NLA_REJECT:
+		if (pt->validation_data && extack)
+			extack->_msg = pt->validation_data;
+		return -EINVAL;
+
 	case NLA_FLAG:
 		if (attrlen > 0)
 			return -ERANGE;
@@ -180,11 +186,10 @@ int nla_validate(const struct nlattr *head, int len, int maxtype,
 	int rem;
 
 	nla_for_each_attr(nla, head, len, rem) {
-		int err = validate_nla(nla, maxtype, policy);
+		int err = validate_nla(nla, maxtype, policy, extack);
 
 		if (err < 0) {
-			if (extack)
-				extack->bad_attr = nla;
+			NL_SET_BAD_ATTR(extack, nla);
 			return err;
 		}
 	}
@@ -251,10 +256,13 @@ int nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head,
 
 		if (type > 0 && type <= maxtype) {
 			if (policy) {
-				err = validate_nla(nla, maxtype, policy);
+				err = validate_nla(nla, maxtype, policy,
+						   extack);
 				if (err < 0) {
-					NL_SET_ERR_MSG_ATTR(extack, nla,
-							    "Attribute failed policy validation");
+					NL_SET_BAD_ATTR(extack, nla);
+					if (extack && !extack->_msg)
+						NL_SET_ERR_MSG(extack,
+							       "Attribute failed policy validation");
 					goto errout;
 				}
 			}
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2018-09-18 22:16 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-13  8:46 [PATCH 1/2] netlink: add NLA_REJECT policy type Johannes Berg
2018-09-13  8:46 ` [PATCH 2/2] netlink: add ethernet address policy types Johannes Berg
     [not found]   ` <20180913084603.7979-2-johannes-cdvu00un1VgdHxzADdlk8Q@public.gmane.org>
2018-09-13 11:58     ` Michal Kubecek
2018-09-13 12:02       ` Johannes Berg
2018-09-13 12:12         ` Michal Kubecek
2018-09-13 12:16           ` Johannes Berg
     [not found]             ` <1536840966.4160.6.camel-cdvu00un1VgdHxzADdlk8Q@public.gmane.org>
2018-09-13 12:24               ` Michal Kubecek
     [not found]                 ` <20180913122412.GI29691-OEaqT8BN2ewCVLCxKZUutA@public.gmane.org>
2018-09-13 12:46                   ` Johannes Berg
2018-09-13 16:03                     ` Michal Kubecek
2018-09-13 19:41             ` Marcelo Ricardo Leitner
2018-09-13 20:39               ` Michal Kubecek
2018-09-17  7:45                 ` Johannes Berg
2018-09-13 10:49 ` [PATCH 1/2] netlink: add NLA_REJECT policy type Michal Kubecek
     [not found]   ` <20180913104955.GE29691-OEaqT8BN2ewCVLCxKZUutA@public.gmane.org>
2018-09-13 11:25     ` Johannes Berg
2018-09-13 12:05       ` Michal Kubecek
2018-09-13 19:20         ` Marcelo Ricardo Leitner
2018-09-13 20:43           ` Michal Kubecek
2018-09-13 19:30 ` Marcelo Ricardo Leitner
2018-09-13 21:27   ` Michal Kubecek
2018-09-13 21:58     ` Marcelo Ricardo Leitner
     [not found]       ` <20180913215839.GI27095-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2018-09-17  9:38         ` Johannes Berg
2018-09-17 20:17           ` Marcelo Ricardo Leitner
     [not found]           ` <1537177132.2957.6.camel-cdvu00un1VgdHxzADdlk8Q@public.gmane.org>
2018-09-18 12:34             ` Jamal Hadi Salim
2018-09-18 12:39               ` Johannes Berg
2018-09-18 12:55                 ` Jamal Hadi Salim
2018-09-18 12:57                   ` Johannes Berg
2018-09-18 13:12                     ` Jamal Hadi Salim
2018-09-18 16:42                       ` Johannes Berg
2018-09-13 22:59 ` David Miller
     [not found]   ` <20180913.155934.742447935316828936.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2018-09-17  9:39     ` Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).