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