netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type
@ 2018-01-16 22:01 Lorenzo Bianconi
  2018-01-16 22:01 ` [PATCH v3 net-next 1/4] l2tp: double-check l2specific_type provided by userspace Lorenzo Bianconi
                   ` (5 more replies)
  0 siblings, 6 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2018-01-16 22:01 UTC (permalink / raw)
  To: davem; +Cc: netdev, jchapman, g.nault

Do not rely on l2specific_len value provided by userspace but set sublayer
length according to l2specific_type.
Mark L2TP_ATTR_L2SPEC_LEN attribute as not used

Changes since v2:
- drop the patch related to a fix in the switch default case in
  l2tp_nl_cmd_session_create()
- use L2SPECTYPE_NONE as default case in l2tp_get_l2specific_len()

Changes since v1:
- remove l2specific_len parameter
- add sanity check on l2specific_type provided by userspace

Lorenzo Bianconi (4):
  l2tp: double-check l2specific_type provided by userspace
  l2tp: remove l2specific_len dependency in l2tp_core
  l2tp: remove l2specific_len configurable parameter
  l2tp: mark L2TP_ATTR_L2SPEC_LEN as not used

 include/uapi/linux/l2tp.h |  2 +-
 net/l2tp/l2tp_core.c      | 35 ++++++++++++++++-------------------
 net/l2tp/l2tp_core.h      | 13 +++++++++++--
 net/l2tp/l2tp_debugfs.c   |  2 +-
 net/l2tp/l2tp_netlink.c   | 15 +++++++++------
 5 files changed, 38 insertions(+), 29 deletions(-)

-- 
2.13.6

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

* [PATCH v3 net-next 1/4] l2tp: double-check l2specific_type provided by userspace
  2018-01-16 22:01 [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Lorenzo Bianconi
@ 2018-01-16 22:01 ` Lorenzo Bianconi
  2018-01-16 22:01 ` [PATCH v3 net-next 2/4] l2tp: remove l2specific_len dependency in l2tp_core Lorenzo Bianconi
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2018-01-16 22:01 UTC (permalink / raw)
  To: davem; +Cc: netdev, jchapman, g.nault

Add sanity check on l2specific_type provided by userspace in
l2tp_nl_cmd_session_create() since just L2TP_L2SPECTYPE_DEFAULT and
L2TP_L2SPECTYPE_NONE are currently supported.
Moreover explicitly set l2specific_type to L2TP_L2SPECTYPE_DEFAULT
only if the userspace does not provide a value for it

Reviewed-by: Guillaume Nault <g.nault@alphalink.fr>
Tested-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 net/l2tp/l2tp_netlink.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c
index e1ca29f79821..9ba2b8a68f65 100644
--- a/net/l2tp/l2tp_netlink.c
+++ b/net/l2tp/l2tp_netlink.c
@@ -550,9 +550,16 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
 		if (info->attrs[L2TP_ATTR_DATA_SEQ])
 			cfg.data_seq = nla_get_u8(info->attrs[L2TP_ATTR_DATA_SEQ]);
 
-		cfg.l2specific_type = L2TP_L2SPECTYPE_DEFAULT;
-		if (info->attrs[L2TP_ATTR_L2SPEC_TYPE])
+		if (info->attrs[L2TP_ATTR_L2SPEC_TYPE]) {
 			cfg.l2specific_type = nla_get_u8(info->attrs[L2TP_ATTR_L2SPEC_TYPE]);
+			if (cfg.l2specific_type != L2TP_L2SPECTYPE_DEFAULT &&
+			    cfg.l2specific_type != L2TP_L2SPECTYPE_NONE) {
+				ret = -EINVAL;
+				goto out_tunnel;
+			}
+		} else {
+			cfg.l2specific_type = L2TP_L2SPECTYPE_DEFAULT;
+		}
 
 		cfg.l2specific_len = 4;
 		if (info->attrs[L2TP_ATTR_L2SPEC_LEN])
-- 
2.13.6

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

* [PATCH v3 net-next 2/4] l2tp: remove l2specific_len dependency in l2tp_core
  2018-01-16 22:01 [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Lorenzo Bianconi
  2018-01-16 22:01 ` [PATCH v3 net-next 1/4] l2tp: double-check l2specific_type provided by userspace Lorenzo Bianconi
@ 2018-01-16 22:01 ` Lorenzo Bianconi
  2018-01-16 22:01 ` [PATCH v3 net-next 3/4] l2tp: remove l2specific_len configurable parameter Lorenzo Bianconi
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2018-01-16 22:01 UTC (permalink / raw)
  To: davem; +Cc: netdev, jchapman, g.nault

Remove l2specific_len dependency while building l2tpv3 header or
parsing the received frame since default L2-Specific Sublayer is
always four bytes long and we don't need to rely on a user supplied
value.
Moreover in l2tp netlink code there are no sanity checks to
enforce the relation between l2specific_len and l2specific_type,
so sending a malformed netlink message is possible to set
l2specific_type to L2TP_L2SPECTYPE_DEFAULT (or even
L2TP_L2SPECTYPE_NONE) and set l2specific_len to a value greater than
4 leaking memory on the wire and sending corrupted frames.

Reviewed-by: Guillaume Nault <g.nault@alphalink.fr>
Tested-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 net/l2tp/l2tp_core.c | 34 ++++++++++++++++------------------
 net/l2tp/l2tp_core.h | 11 +++++++++++
 2 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index 62285fc6eb59..88efb8b845ca 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -730,11 +730,9 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
 				 "%s: recv data ns=%u, session nr=%u\n",
 				 session->name, ns, session->nr);
 		}
+		ptr += 4;
 	}
 
-	/* Advance past L2-specific header, if present */
-	ptr += session->l2specific_len;
-
 	if (L2TP_SKB_CB(skb)->has_seq) {
 		/* Received a packet with sequence numbers. If we're the LNS,
 		 * check if we sre sending sequence numbers and if not,
@@ -1048,21 +1046,20 @@ static int l2tp_build_l2tpv3_header(struct l2tp_session *session, void *buf)
 		memcpy(bufp, &session->cookie[0], session->cookie_len);
 		bufp += session->cookie_len;
 	}
-	if (session->l2specific_len) {
-		if (session->l2specific_type == L2TP_L2SPECTYPE_DEFAULT) {
-			u32 l2h = 0;
-			if (session->send_seq) {
-				l2h = 0x40000000 | session->ns;
-				session->ns++;
-				session->ns &= 0xffffff;
-				l2tp_dbg(session, L2TP_MSG_SEQ,
-					 "%s: updated ns to %u\n",
-					 session->name, session->ns);
-			}
+	if (session->l2specific_type == L2TP_L2SPECTYPE_DEFAULT) {
+		u32 l2h = 0;
 
-			*((__be32 *) bufp) = htonl(l2h);
+		if (session->send_seq) {
+			l2h = 0x40000000 | session->ns;
+			session->ns++;
+			session->ns &= 0xffffff;
+			l2tp_dbg(session, L2TP_MSG_SEQ,
+				 "%s: updated ns to %u\n",
+				 session->name, session->ns);
 		}
-		bufp += session->l2specific_len;
+
+		*((__be32 *)bufp) = htonl(l2h);
+		bufp += 4;
 	}
 
 	return bufp - optr;
@@ -1719,7 +1716,7 @@ int l2tp_session_delete(struct l2tp_session *session)
 EXPORT_SYMBOL_GPL(l2tp_session_delete);
 
 /* We come here whenever a session's send_seq, cookie_len or
- * l2specific_len parameters are set.
+ * l2specific_type parameters are set.
  */
 void l2tp_session_set_header_len(struct l2tp_session *session, int version)
 {
@@ -1728,7 +1725,8 @@ void l2tp_session_set_header_len(struct l2tp_session *session, int version)
 		if (session->send_seq)
 			session->hdr_len += 4;
 	} else {
-		session->hdr_len = 4 + session->cookie_len + session->l2specific_len;
+		session->hdr_len = 4 + session->cookie_len;
+		session->hdr_len += l2tp_get_l2specific_len(session);
 		if (session->tunnel->encap == L2TP_ENCAPTYPE_UDP)
 			session->hdr_len += 4;
 	}
diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h
index c2e9bbd79b35..7bef304de4f0 100644
--- a/net/l2tp/l2tp_core.h
+++ b/net/l2tp/l2tp_core.h
@@ -302,6 +302,17 @@ static inline void l2tp_session_dec_refcount(struct l2tp_session *session)
 		l2tp_session_free(session);
 }
 
+static inline int l2tp_get_l2specific_len(struct l2tp_session *session)
+{
+	switch (session->l2specific_type) {
+	case L2TP_L2SPECTYPE_DEFAULT:
+		return 4;
+	case L2TP_L2SPECTYPE_NONE:
+	default:
+		return 0;
+	}
+}
+
 #define l2tp_printk(ptr, type, func, fmt, ...)				\
 do {									\
 	if (((ptr)->debug) & (type))					\
-- 
2.13.6

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

* [PATCH v3 net-next 3/4] l2tp: remove l2specific_len configurable parameter
  2018-01-16 22:01 [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Lorenzo Bianconi
  2018-01-16 22:01 ` [PATCH v3 net-next 1/4] l2tp: double-check l2specific_type provided by userspace Lorenzo Bianconi
  2018-01-16 22:01 ` [PATCH v3 net-next 2/4] l2tp: remove l2specific_len dependency in l2tp_core Lorenzo Bianconi
@ 2018-01-16 22:01 ` Lorenzo Bianconi
  2018-01-16 22:01 ` [PATCH v3 net-next 4/4] l2tp: mark L2TP_ATTR_L2SPEC_LEN as not used Lorenzo Bianconi
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2018-01-16 22:01 UTC (permalink / raw)
  To: davem; +Cc: netdev, jchapman, g.nault

Remove l2specific_len configuration parameter since now L2-Specific
Sublayer length is computed according to l2specific_type provided by
userspace.

Reviewed-by: Guillaume Nault <g.nault@alphalink.fr>
Tested-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 net/l2tp/l2tp_core.c    | 1 -
 net/l2tp/l2tp_core.h    | 2 --
 net/l2tp/l2tp_debugfs.c | 2 +-
 net/l2tp/l2tp_netlink.c | 4 ----
 4 files changed, 1 insertion(+), 8 deletions(-)

diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c
index 88efb8b845ca..194a7483bb93 100644
--- a/net/l2tp/l2tp_core.c
+++ b/net/l2tp/l2tp_core.c
@@ -1777,7 +1777,6 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn
 			session->lns_mode = cfg->lns_mode;
 			session->reorder_timeout = cfg->reorder_timeout;
 			session->l2specific_type = cfg->l2specific_type;
-			session->l2specific_len = cfg->l2specific_len;
 			session->cookie_len = cfg->cookie_len;
 			memcpy(&session->cookie[0], &cfg->cookie[0], cfg->cookie_len);
 			session->peer_cookie_len = cfg->peer_cookie_len;
diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h
index 7bef304de4f0..9bbee90e9963 100644
--- a/net/l2tp/l2tp_core.h
+++ b/net/l2tp/l2tp_core.h
@@ -59,7 +59,6 @@ struct l2tp_session_cfg {
 	int			debug;		/* bitmask of debug message
 						 * categories */
 	u16			vlan_id;	/* VLAN pseudowire only */
-	u16			l2specific_len;	/* Layer 2 specific length */
 	u16			l2specific_type; /* Layer 2 specific type */
 	u8			cookie[8];	/* optional cookie */
 	int			cookie_len;	/* 0, 4 or 8 bytes */
@@ -85,7 +84,6 @@ struct l2tp_session {
 	int			cookie_len;
 	u8			peer_cookie[8];
 	int			peer_cookie_len;
-	u16			l2specific_len;
 	u16			l2specific_type;
 	u16			hdr_len;
 	u32			nr;		/* session NR state (receive) */
diff --git a/net/l2tp/l2tp_debugfs.c b/net/l2tp/l2tp_debugfs.c
index 2c30587d1a14..72e713da4733 100644
--- a/net/l2tp/l2tp_debugfs.c
+++ b/net/l2tp/l2tp_debugfs.c
@@ -181,7 +181,7 @@ static void l2tp_dfs_seq_session_show(struct seq_file *m, void *v)
 		   session->debug,
 		   jiffies_to_msecs(session->reorder_timeout));
 	seq_printf(m, "   offset 0 l2specific %hu/%hu\n",
-		   session->l2specific_type, session->l2specific_len);
+		   session->l2specific_type, l2tp_get_l2specific_len(session));
 	if (session->cookie_len) {
 		seq_printf(m, "   cookie %02x%02x%02x%02x",
 			   session->cookie[0], session->cookie[1],
diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c
index 9ba2b8a68f65..405a5341ed1e 100644
--- a/net/l2tp/l2tp_netlink.c
+++ b/net/l2tp/l2tp_netlink.c
@@ -561,10 +561,6 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
 			cfg.l2specific_type = L2TP_L2SPECTYPE_DEFAULT;
 		}
 
-		cfg.l2specific_len = 4;
-		if (info->attrs[L2TP_ATTR_L2SPEC_LEN])
-			cfg.l2specific_len = nla_get_u8(info->attrs[L2TP_ATTR_L2SPEC_LEN]);
-
 		if (info->attrs[L2TP_ATTR_COOKIE]) {
 			u16 len = nla_len(info->attrs[L2TP_ATTR_COOKIE]);
 			if (len > 8) {
-- 
2.13.6

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

* [PATCH v3 net-next 4/4] l2tp: mark L2TP_ATTR_L2SPEC_LEN as not used
  2018-01-16 22:01 [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Lorenzo Bianconi
                   ` (2 preceding siblings ...)
  2018-01-16 22:01 ` [PATCH v3 net-next 3/4] l2tp: remove l2specific_len configurable parameter Lorenzo Bianconi
@ 2018-01-16 22:01 ` Lorenzo Bianconi
  2018-01-17 10:23 ` [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Guillaume Nault
  2018-01-19 20:03 ` David Miller
  5 siblings, 0 replies; 8+ messages in thread
From: Lorenzo Bianconi @ 2018-01-16 22:01 UTC (permalink / raw)
  To: davem; +Cc: netdev, jchapman, g.nault

Reviewed-by: Guillaume Nault <g.nault@alphalink.fr>
Tested-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 include/uapi/linux/l2tp.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/uapi/linux/l2tp.h b/include/uapi/linux/l2tp.h
index 71e62795104d..7d570c7bd117 100644
--- a/include/uapi/linux/l2tp.h
+++ b/include/uapi/linux/l2tp.h
@@ -97,7 +97,7 @@ enum {
 	L2TP_ATTR_OFFSET,		/* u16 (not used) */
 	L2TP_ATTR_DATA_SEQ,		/* u16 */
 	L2TP_ATTR_L2SPEC_TYPE,		/* u8, enum l2tp_l2spec_type */
-	L2TP_ATTR_L2SPEC_LEN,		/* u8, enum l2tp_l2spec_type */
+	L2TP_ATTR_L2SPEC_LEN,		/* u8 (not used) */
 	L2TP_ATTR_PROTO_VERSION,	/* u8 */
 	L2TP_ATTR_IFNAME,		/* string */
 	L2TP_ATTR_CONN_ID,		/* u32 */
-- 
2.13.6

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

* Re: [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type
  2018-01-16 22:01 [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Lorenzo Bianconi
                   ` (3 preceding siblings ...)
  2018-01-16 22:01 ` [PATCH v3 net-next 4/4] l2tp: mark L2TP_ATTR_L2SPEC_LEN as not used Lorenzo Bianconi
@ 2018-01-17 10:23 ` Guillaume Nault
  2018-01-17 14:56   ` James Chapman
  2018-01-19 20:03 ` David Miller
  5 siblings, 1 reply; 8+ messages in thread
From: Guillaume Nault @ 2018-01-17 10:23 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: davem, netdev, jchapman

On Tue, Jan 16, 2018 at 11:01:53PM +0100, Lorenzo Bianconi wrote:
> Do not rely on l2specific_len value provided by userspace but set sublayer
> length according to l2specific_type.
> Mark L2TP_ATTR_L2SPEC_LEN attribute as not used
> 
Nice. Thanks for doing this work Lorenzo.

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

* Re: [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type
  2018-01-17 10:23 ` [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Guillaume Nault
@ 2018-01-17 14:56   ` James Chapman
  0 siblings, 0 replies; 8+ messages in thread
From: James Chapman @ 2018-01-17 14:56 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: David S. Miller, Guillaume Nault, netdev

On 17 January 2018 at 10:23, Guillaume Nault <g.nault@alphalink.fr> wrote:
> On Tue, Jan 16, 2018 at 11:01:53PM +0100, Lorenzo Bianconi wrote:
>> Do not rely on l2specific_len value provided by userspace but set sublayer
>> length according to l2specific_type.
>> Mark L2TP_ATTR_L2SPEC_LEN attribute as not used
>>
> Nice. Thanks for doing this work Lorenzo.

Acked-by: James Chapman <jchapman@katalix.com>

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

* Re: [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type
  2018-01-16 22:01 [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Lorenzo Bianconi
                   ` (4 preceding siblings ...)
  2018-01-17 10:23 ` [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Guillaume Nault
@ 2018-01-19 20:03 ` David Miller
  5 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2018-01-19 20:03 UTC (permalink / raw)
  To: lorenzo.bianconi; +Cc: netdev, jchapman, g.nault

From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Date: Tue, 16 Jan 2018 23:01:53 +0100

> Do not rely on l2specific_len value provided by userspace but set sublayer
> length according to l2specific_type.
> Mark L2TP_ATTR_L2SPEC_LEN attribute as not used
> 
> Changes since v2:
> - drop the patch related to a fix in the switch default case in
>   l2tp_nl_cmd_session_create()
> - use L2SPECTYPE_NONE as default case in l2tp_get_l2specific_len()
> 
> Changes since v1:
> - remove l2specific_len parameter
> - add sanity check on l2specific_type provided by userspace

Series applied, thanks Lorenzo.

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

end of thread, other threads:[~2018-01-19 20:03 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-16 22:01 [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Lorenzo Bianconi
2018-01-16 22:01 ` [PATCH v3 net-next 1/4] l2tp: double-check l2specific_type provided by userspace Lorenzo Bianconi
2018-01-16 22:01 ` [PATCH v3 net-next 2/4] l2tp: remove l2specific_len dependency in l2tp_core Lorenzo Bianconi
2018-01-16 22:01 ` [PATCH v3 net-next 3/4] l2tp: remove l2specific_len configurable parameter Lorenzo Bianconi
2018-01-16 22:01 ` [PATCH v3 net-next 4/4] l2tp: mark L2TP_ATTR_L2SPEC_LEN as not used Lorenzo Bianconi
2018-01-17 10:23 ` [PATCH v3 net-next 0/4] l2tp: set l2specific_len based on l2specific_type Guillaume Nault
2018-01-17 14:56   ` James Chapman
2018-01-19 20:03 ` David Miller

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).