Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
8d42fda9
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
8d42fda9
编写于
10年前
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'topic/core-vuln-fixes' into for-linus
上级
6c0c9a3d
883a1d49
无相关合并请求
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
54 addition
and
27 deletion
+54
-27
include/sound/core.h
include/sound/core.h
+2
-0
sound/core/control.c
sound/core/control.c
+51
-27
sound/core/init.c
sound/core/init.c
+1
-0
未找到文件。
include/sound/core.h
浏览文件 @
8d42fda9
...
...
@@ -116,6 +116,8 @@ struct snd_card {
int
user_ctl_count
;
/* count of all user controls */
struct
list_head
controls
;
/* all controls for this card */
struct
list_head
ctl_files
;
/* active control files */
struct
mutex
user_ctl_lock
;
/* protects user controls against
concurrent access */
struct
snd_info_entry
*
proc_root
;
/* root for soundcard specific files */
struct
snd_info_entry
*
proc_id
;
/* the card id */
...
...
This diff is collapsed.
Click to expand it.
sound/core/control.c
浏览文件 @
8d42fda9
...
...
@@ -288,6 +288,10 @@ static bool snd_ctl_remove_numid_conflict(struct snd_card *card,
{
struct
snd_kcontrol
*
kctl
;
/* Make sure that the ids assigned to the control do not wrap around */
if
(
card
->
last_numid
>=
UINT_MAX
-
count
)
card
->
last_numid
=
0
;
list_for_each_entry
(
kctl
,
&
card
->
controls
,
list
)
{
if
(
kctl
->
id
.
numid
<
card
->
last_numid
+
1
+
count
&&
kctl
->
id
.
numid
+
kctl
->
count
>
card
->
last_numid
+
1
)
{
...
...
@@ -330,6 +334,7 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
{
struct
snd_ctl_elem_id
id
;
unsigned
int
idx
;
unsigned
int
count
;
int
err
=
-
EINVAL
;
if
(
!
kcontrol
)
...
...
@@ -337,6 +342,9 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
if
(
snd_BUG_ON
(
!
card
||
!
kcontrol
->
info
))
goto
error
;
id
=
kcontrol
->
id
;
if
(
id
.
index
>
UINT_MAX
-
kcontrol
->
count
)
goto
error
;
down_write
(
&
card
->
controls_rwsem
);
if
(
snd_ctl_find_id
(
card
,
&
id
))
{
up_write
(
&
card
->
controls_rwsem
);
...
...
@@ -358,8 +366,9 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
card
->
controls_count
+=
kcontrol
->
count
;
kcontrol
->
id
.
numid
=
card
->
last_numid
+
1
;
card
->
last_numid
+=
kcontrol
->
count
;
count
=
kcontrol
->
count
;
up_write
(
&
card
->
controls_rwsem
);
for
(
idx
=
0
;
idx
<
kcontrol
->
count
;
idx
++
,
id
.
index
++
,
id
.
numid
++
)
for
(
idx
=
0
;
idx
<
count
;
idx
++
,
id
.
index
++
,
id
.
numid
++
)
snd_ctl_notify
(
card
,
SNDRV_CTL_EVENT_MASK_ADD
,
&
id
);
return
0
;
...
...
@@ -388,6 +397,7 @@ int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol,
bool
add_on_replace
)
{
struct
snd_ctl_elem_id
id
;
unsigned
int
count
;
unsigned
int
idx
;
struct
snd_kcontrol
*
old
;
int
ret
;
...
...
@@ -423,8 +433,9 @@ int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol,
card
->
controls_count
+=
kcontrol
->
count
;
kcontrol
->
id
.
numid
=
card
->
last_numid
+
1
;
card
->
last_numid
+=
kcontrol
->
count
;
count
=
kcontrol
->
count
;
up_write
(
&
card
->
controls_rwsem
);
for
(
idx
=
0
;
idx
<
kcontrol
->
count
;
idx
++
,
id
.
index
++
,
id
.
numid
++
)
for
(
idx
=
0
;
idx
<
count
;
idx
++
,
id
.
index
++
,
id
.
numid
++
)
snd_ctl_notify
(
card
,
SNDRV_CTL_EVENT_MASK_ADD
,
&
id
);
return
0
;
...
...
@@ -897,9 +908,9 @@ static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file,
result
=
kctl
->
put
(
kctl
,
control
);
}
if
(
result
>
0
)
{
struct
snd_ctl_elem_id
id
=
control
->
id
;
up_read
(
&
card
->
controls_rwsem
);
snd_ctl_notify
(
card
,
SNDRV_CTL_EVENT_MASK_VALUE
,
&
control
->
id
);
snd_ctl_notify
(
card
,
SNDRV_CTL_EVENT_MASK_VALUE
,
&
id
);
return
0
;
}
}
...
...
@@ -991,6 +1002,7 @@ static int snd_ctl_elem_unlock(struct snd_ctl_file *file,
struct
user_element
{
struct
snd_ctl_elem_info
info
;
struct
snd_card
*
card
;
void
*
elem_data
;
/* element data */
unsigned
long
elem_data_size
;
/* size of element data in bytes */
void
*
tlv_data
;
/* TLV data */
...
...
@@ -1034,7 +1046,9 @@ static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol,
{
struct
user_element
*
ue
=
kcontrol
->
private_data
;
mutex_lock
(
&
ue
->
card
->
user_ctl_lock
);
memcpy
(
&
ucontrol
->
value
,
ue
->
elem_data
,
ue
->
elem_data_size
);
mutex_unlock
(
&
ue
->
card
->
user_ctl_lock
);
return
0
;
}
...
...
@@ -1043,10 +1057,12 @@ static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol,
{
int
change
;
struct
user_element
*
ue
=
kcontrol
->
private_data
;
mutex_lock
(
&
ue
->
card
->
user_ctl_lock
);
change
=
memcmp
(
&
ucontrol
->
value
,
ue
->
elem_data
,
ue
->
elem_data_size
)
!=
0
;
if
(
change
)
memcpy
(
ue
->
elem_data
,
&
ucontrol
->
value
,
ue
->
elem_data_size
);
mutex_unlock
(
&
ue
->
card
->
user_ctl_lock
);
return
change
;
}
...
...
@@ -1066,19 +1082,32 @@ static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kcontrol,
new_data
=
memdup_user
(
tlv
,
size
);
if
(
IS_ERR
(
new_data
))
return
PTR_ERR
(
new_data
);
mutex_lock
(
&
ue
->
card
->
user_ctl_lock
);
change
=
ue
->
tlv_data_size
!=
size
;
if
(
!
change
)
change
=
memcmp
(
ue
->
tlv_data
,
new_data
,
size
);
kfree
(
ue
->
tlv_data
);
ue
->
tlv_data
=
new_data
;
ue
->
tlv_data_size
=
size
;
mutex_unlock
(
&
ue
->
card
->
user_ctl_lock
);
}
else
{
if
(
!
ue
->
tlv_data_size
||
!
ue
->
tlv_data
)
return
-
ENXIO
;
if
(
size
<
ue
->
tlv_data_size
)
return
-
ENOSPC
;
int
ret
=
0
;
mutex_lock
(
&
ue
->
card
->
user_ctl_lock
);
if
(
!
ue
->
tlv_data_size
||
!
ue
->
tlv_data
)
{
ret
=
-
ENXIO
;
goto
err_unlock
;
}
if
(
size
<
ue
->
tlv_data_size
)
{
ret
=
-
ENOSPC
;
goto
err_unlock
;
}
if
(
copy_to_user
(
tlv
,
ue
->
tlv_data
,
ue
->
tlv_data_size
))
return
-
EFAULT
;
ret
=
-
EFAULT
;
err_unlock:
mutex_unlock
(
&
ue
->
card
->
user_ctl_lock
);
if
(
ret
)
return
ret
;
}
return
change
;
}
...
...
@@ -1136,8 +1165,6 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
struct
user_element
*
ue
;
int
idx
,
err
;
if
(
!
replace
&&
card
->
user_ctl_count
>=
MAX_USER_CONTROLS
)
return
-
ENOMEM
;
if
(
info
->
count
<
1
)
return
-
EINVAL
;
access
=
info
->
access
==
0
?
SNDRV_CTL_ELEM_ACCESS_READWRITE
:
...
...
@@ -1146,21 +1173,16 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE
));
info
->
id
.
numid
=
0
;
memset
(
&
kctl
,
0
,
sizeof
(
kctl
));
down_write
(
&
card
->
controls_rwsem
);
_kctl
=
snd_ctl_find_id
(
card
,
&
info
->
id
);
err
=
0
;
if
(
_kctl
)
{
if
(
replace
)
err
=
snd_ctl_remove
(
card
,
_kctl
);
else
err
=
-
EBUSY
;
}
else
{
if
(
replace
)
err
=
-
ENOENT
;
if
(
replace
)
{
err
=
snd_ctl_remove_user_ctl
(
file
,
&
info
->
id
);
if
(
err
)
return
err
;
}
up_write
(
&
card
->
controls_rwsem
);
if
(
err
<
0
)
return
err
;
if
(
card
->
user_ctl_count
>=
MAX_USER_CONTROLS
)
return
-
ENOMEM
;
memcpy
(
&
kctl
.
id
,
&
info
->
id
,
sizeof
(
info
->
id
));
kctl
.
count
=
info
->
owner
?
info
->
owner
:
1
;
access
|=
SNDRV_CTL_ELEM_ACCESS_USER
;
...
...
@@ -1210,6 +1232,7 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
ue
=
kzalloc
(
sizeof
(
struct
user_element
)
+
private_size
,
GFP_KERNEL
);
if
(
ue
==
NULL
)
return
-
ENOMEM
;
ue
->
card
=
card
;
ue
->
info
=
*
info
;
ue
->
info
.
access
=
0
;
ue
->
elem_data
=
(
char
*
)
ue
+
sizeof
(
*
ue
);
...
...
@@ -1321,8 +1344,9 @@ static int snd_ctl_tlv_ioctl(struct snd_ctl_file *file,
}
err
=
kctl
->
tlv
.
c
(
kctl
,
op_flag
,
tlv
.
length
,
_tlv
->
tlv
);
if
(
err
>
0
)
{
struct
snd_ctl_elem_id
id
=
kctl
->
id
;
up_read
(
&
card
->
controls_rwsem
);
snd_ctl_notify
(
card
,
SNDRV_CTL_EVENT_MASK_TLV
,
&
kctl
->
id
);
snd_ctl_notify
(
card
,
SNDRV_CTL_EVENT_MASK_TLV
,
&
id
);
return
0
;
}
}
else
{
...
...
This diff is collapsed.
Click to expand it.
sound/core/init.c
浏览文件 @
8d42fda9
...
...
@@ -232,6 +232,7 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
INIT_LIST_HEAD
(
&
card
->
devices
);
init_rwsem
(
&
card
->
controls_rwsem
);
rwlock_init
(
&
card
->
ctl_files_rwlock
);
mutex_init
(
&
card
->
user_ctl_lock
);
INIT_LIST_HEAD
(
&
card
->
controls
);
INIT_LIST_HEAD
(
&
card
->
ctl_files
);
spin_lock_init
(
&
card
->
files_lock
);
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
新手
引导
客服
返回
顶部