Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
d88174e4
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
d88174e4
编写于
12月 21, 2007
作者:
D
David S. Miller
提交者:
David S. Miller
6月 16, 2008
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
wext: Extract private call iw_point handling into seperate functions.
Signed-off-by:
N
David S. Miller
<
davem@davemloft.net
>
上级
84149b0f
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
74 addition
and
67 deletion
+74
-67
net/wireless/wext.c
net/wireless/wext.c
+74
-67
未找到文件。
net/wireless/wext.c
浏览文件 @
d88174e4
...
@@ -890,25 +890,22 @@ static int ioctl_standard_call(struct net_device * dev,
...
@@ -890,25 +890,22 @@ static int ioctl_standard_call(struct net_device * dev,
* a iw_handler but process it in your ioctl handler (i.e. use the
* a iw_handler but process it in your ioctl handler (i.e. use the
* old driver API).
* old driver API).
*/
*/
static
int
ioctl_private_call
(
struct
net_device
*
dev
,
struct
ifreq
*
ifr
,
static
int
get_priv_descr_and_size
(
struct
net_device
*
dev
,
unsigned
int
cmd
,
unsigned
int
cmd
,
iw_handler
handler
)
const
struct
iw_priv_args
**
descrp
)
{
{
struct
iwreq
*
iwr
=
(
struct
iwreq
*
)
ifr
;
const
struct
iw_priv_args
*
descr
;
const
struct
iw_priv_args
*
descr
=
NULL
;
int
i
,
extra_size
;
struct
iw_request_info
info
;
int
extra_size
=
0
;
int
i
;
int
ret
=
-
EINVAL
;
/* Get the description of the IOCTL */
descr
=
NULL
;
for
(
i
=
0
;
i
<
dev
->
wireless_handlers
->
num_private_args
;
i
++
)
for
(
i
=
0
;
i
<
dev
->
wireless_handlers
->
num_private_args
;
i
++
)
{
if
(
cmd
==
dev
->
wireless_handlers
->
private_args
[
i
].
cmd
)
{
if
(
cmd
==
dev
->
wireless_handlers
->
private_args
[
i
].
cmd
)
{
descr
=
&
(
dev
->
wireless_handlers
->
private_args
[
i
])
;
descr
=
&
dev
->
wireless_handlers
->
private_args
[
i
]
;
break
;
break
;
}
}
}
/* Compute the size of the set/get arguments */
extra_size
=
0
;
if
(
descr
!=
NULL
)
{
if
(
descr
)
{
if
(
IW_IS_SET
(
cmd
))
{
if
(
IW_IS_SET
(
cmd
))
{
int
offset
=
0
;
/* For sub-ioctls */
int
offset
=
0
;
/* For sub-ioctls */
/* Check for sub-ioctl handler */
/* Check for sub-ioctl handler */
...
@@ -933,72 +930,82 @@ static int ioctl_private_call(struct net_device *dev, struct ifreq *ifr,
...
@@ -933,72 +930,82 @@ static int ioctl_private_call(struct net_device *dev, struct ifreq *ifr,
extra_size
=
0
;
extra_size
=
0
;
}
}
}
}
*
descrp
=
descr
;
return
extra_size
;
}
/* Prepare the call */
static
int
ioctl_private_iw_point
(
struct
iw_point
*
iwp
,
unsigned
int
cmd
,
info
.
cmd
=
cmd
;
const
struct
iw_priv_args
*
descr
,
info
.
flags
=
0
;
iw_handler
handler
,
struct
net_device
*
dev
,
struct
iw_request_info
*
info
,
int
extra_size
)
/* Check if we have a pointer to user space data or not. */
{
if
(
extra_size
==
0
)
{
char
*
extra
;
/* No extra arguments. Trivial to handle */
ret
=
handler
(
dev
,
&
info
,
&
(
iwr
->
u
),
(
char
*
)
&
(
iwr
->
u
));
}
else
{
char
*
extra
;
int
err
;
int
err
;
/* Check what user space is giving us */
/* Check what user space is giving us */
if
(
IW_IS_SET
(
cmd
))
{
if
(
IW_IS_SET
(
cmd
))
{
/* Check NULL pointer */
if
(
!
iwp
->
pointer
&&
iwp
->
length
!=
0
)
if
((
iwr
->
u
.
data
.
pointer
==
NULL
)
&&
(
iwr
->
u
.
data
.
length
!=
0
))
return
-
EFAULT
;
return
-
EFAULT
;
/* Does it fits within bounds ? */
if
(
iwp
->
length
>
(
descr
->
set_args
&
IW_PRIV_SIZE_MASK
))
if
(
iwr
->
u
.
data
.
length
>
(
descr
->
set_args
&
IW_PRIV_SIZE_MASK
))
return
-
E2BIG
;
return
-
E2BIG
;
}
else
if
(
iwr
->
u
.
data
.
pointer
==
NULL
)
}
else
if
(
!
iwp
->
pointer
)
return
-
EFAULT
;
return
-
EFAULT
;
/* Always allocate for max space. Easier, and won't last
* long... */
extra
=
kmalloc
(
extra_size
,
GFP_KERNEL
);
extra
=
kmalloc
(
extra_size
,
GFP_KERNEL
);
if
(
extra
==
NULL
)
if
(
!
extra
)
return
-
ENOMEM
;
return
-
ENOMEM
;
/* If it is a SET, get all the extra data in here */
/* If it is a SET, get all the extra data in here */
if
(
IW_IS_SET
(
cmd
)
&&
(
iwr
->
u
.
data
.
length
!=
0
))
{
if
(
IW_IS_SET
(
cmd
)
&&
(
iwp
->
length
!=
0
))
{
err
=
copy_from_user
(
extra
,
iwr
->
u
.
data
.
pointer
,
if
(
copy_from_user
(
extra
,
iwp
->
pointer
,
extra_size
))
{
extra_size
);
err
=
-
EFAULT
;
if
(
err
)
{
goto
out
;
kfree
(
extra
);
return
-
EFAULT
;
}
}
}
}
/* Call the handler */
/* Call the handler */
ret
=
handler
(
dev
,
&
info
,
&
(
iwr
->
u
)
,
extra
);
err
=
handler
(
dev
,
info
,
(
union
iwreq_data
*
)
iwp
,
extra
);
/* If we have something to return to the user */
/* If we have something to return to the user */
if
(
!
ret
&&
IW_IS_GET
(
cmd
))
{
if
(
!
err
&&
IW_IS_GET
(
cmd
))
{
/* Adjust for the actual length if it's variable,
/* Adjust for the actual length if it's variable,
* avoid leaking kernel bits outside. */
* avoid leaking kernel bits outside.
if
(
!
(
descr
->
get_args
&
IW_PRIV_SIZE_FIXED
))
{
*/
extra_size
=
adjust_priv_size
(
descr
->
get_args
,
if
(
!
(
descr
->
get_args
&
IW_PRIV_SIZE_FIXED
))
&
(
iwr
->
u
.
data
));
extra_size
=
adjust_priv_size
(
descr
->
get_args
,
iwp
);
}
err
=
copy_to_user
(
iwr
->
u
.
data
.
pointer
,
extra
,
if
(
copy_to_user
(
iwp
->
pointer
,
extra
,
extra_size
))
extra_size
);
err
=
-
EFAULT
;
if
(
err
)
ret
=
-
EFAULT
;
}
}
/* Cleanup - I told you it wasn't that long ;-) */
out:
kfree
(
extra
);
kfree
(
extra
);
}
return
err
;
}
static
int
ioctl_private_call
(
struct
net_device
*
dev
,
struct
ifreq
*
ifr
,
unsigned
int
cmd
,
iw_handler
handler
)
{
struct
iwreq
*
iwr
=
(
struct
iwreq
*
)
ifr
;
int
extra_size
=
0
,
ret
=
-
EINVAL
;
const
struct
iw_priv_args
*
descr
;
struct
iw_request_info
info
;
extra_size
=
get_priv_descr_and_size
(
dev
,
cmd
,
&
descr
);
/* Prepare the call */
info
.
cmd
=
cmd
;
info
.
flags
=
0
;
/* Check if we have a pointer to user space data or not. */
if
(
extra_size
==
0
)
{
/* No extra arguments. Trivial to handle */
ret
=
handler
(
dev
,
&
info
,
&
(
iwr
->
u
),
(
char
*
)
&
(
iwr
->
u
));
}
else
{
ret
=
ioctl_private_iw_point
(
&
iwr
->
u
.
data
,
cmd
,
descr
,
handler
,
dev
,
&
info
,
extra_size
);
}
/* Call commit handler if needed and defined */
/* Call commit handler if needed and defined */
if
(
ret
==
-
EIWCOMMIT
)
if
(
ret
==
-
EIWCOMMIT
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录