2014-01-22 09:16:28

by Johannes Berg

[permalink] [raw]
Subject: [PATCH] nl80211: check channel switch validity better

From: Johannes Berg <[email protected]>

Before allowing userspace to initiate a channel switch, check
that it's actually connected in some sense. Also use a more
appropriate error code for the not connected case.

Signed-off-by: Johannes Berg <[email protected]>
---
net/wireless/nl80211.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 6e78c62..0c2ef08 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)

/* useless if AP is not running */
if (!wdev->beacon_interval)
- return -EINVAL;
+ return -ENOTCONN;
break;
case NL80211_IFTYPE_ADHOC:
+ if (!wdev->ssid_len)
+ return -ENOTCONN;
+ break;
case NL80211_IFTYPE_MESH_POINT:
+ if (!wdev->mesh_id_len)
+ return -ENOTCONN;
break;
default:
return -EOPNOTSUPP;
--
1.8.5.1





2014-01-22 18:46:54

by Thomas Pedersen

[permalink] [raw]
Subject: Re: [PATCH] nl80211: check channel switch validity better

On Wed, Jan 22, 2014 at 10:28 AM, Johannes Berg
<[email protected]> wrote:
> On Wed, 2014-01-22 at 10:02 -0800, Thomas Pedersen wrote:
>
>> > --- a/net/wireless/nl80211.c
>> > +++ b/net/wireless/nl80211.c
>> > @@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
>
>> > case NL80211_IFTYPE_MESH_POINT:
>> > + if (!wdev->mesh_id_len)
>> > + return -ENOTCONN;
>>
>> Hmmm. I'm pretty sure there are some users which set the channel prior
>> to mesh join. This would break that and only allow sending the channel
>> with mesh join?
>
> I don't think channel_switch() is invoked for that? That's done only for
> run-time switching of the channel with CSA etc.

Oh right, that was a special case then.

Thanks,
Thomas

2014-01-22 18:28:55

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] nl80211: check channel switch validity better

On Wed, 2014-01-22 at 10:02 -0800, Thomas Pedersen wrote:

> > --- a/net/wireless/nl80211.c
> > +++ b/net/wireless/nl80211.c
> > @@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)

> > case NL80211_IFTYPE_MESH_POINT:
> > + if (!wdev->mesh_id_len)
> > + return -ENOTCONN;
>
> Hmmm. I'm pretty sure there are some users which set the channel prior
> to mesh join. This would break that and only allow sending the channel
> with mesh join?

I don't think channel_switch() is invoked for that? That's done only for
run-time switching of the channel with CSA etc.

johannes


2014-01-22 18:02:43

by Thomas Pedersen

[permalink] [raw]
Subject: Re: [PATCH] nl80211: check channel switch validity better

On Wed, Jan 22, 2014 at 1:16 AM, Johannes Berg
<[email protected]> wrote:
> From: Johannes Berg <[email protected]>
>
> Before allowing userspace to initiate a channel switch, check
> that it's actually connected in some sense. Also use a more
> appropriate error code for the not connected case.
>
> Signed-off-by: Johannes Berg <[email protected]>
> ---
> net/wireless/nl80211.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index 6e78c62..0c2ef08 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -5799,10 +5799,15 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
>
> /* useless if AP is not running */
> if (!wdev->beacon_interval)
> - return -EINVAL;
> + return -ENOTCONN;
> break;
> case NL80211_IFTYPE_ADHOC:
> + if (!wdev->ssid_len)
> + return -ENOTCONN;
> + break;
> case NL80211_IFTYPE_MESH_POINT:
> + if (!wdev->mesh_id_len)
> + return -ENOTCONN;

Hmmm. I'm pretty sure there are some users which set the channel prior
to mesh join. This would break that and only allow sending the channel
with mesh join?

Thomas