aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIliyan Malchev <malchev@google.com>2010-09-30 19:18:16 -0700
committerDima Zavin <dima@android.com>2011-01-04 18:10:25 -0800
commit73dc8051f251f76541fb18135b8110d7eed5fd6d (patch)
tree87d366d132790d38e5a5c0f9766d5239c4285fe6
parente1b8c41d955ada77c04cdf0e91f055197346032d (diff)
downloadexperimental-73dc8051f251f76541fb18135b8110d7eed5fd6d.tar.gz
[ARM] msm8k: fixes for audio_ctl and pcm_out
-- q6_ioctl was not doing proper checks on user data -- pcm_ioctl would crash if AUDIO_SET_VOUME got called before AUDIO_START Signed-off-by: Iliyan Malchev <malchev@google.com>
-rw-r--r--arch/arm/mach-msm/qdsp6/audio_ctl.c30
-rw-r--r--arch/arm/mach-msm/qdsp6/pcm_out.c6
2 files changed, 29 insertions, 7 deletions
diff --git a/arch/arm/mach-msm/qdsp6/audio_ctl.c b/arch/arm/mach-msm/qdsp6/audio_ctl.c
index 5f9f317babb..170b3eb10f6 100644
--- a/arch/arm/mach-msm/qdsp6/audio_ctl.c
+++ b/arch/arm/mach-msm/qdsp6/audio_ctl.c
@@ -90,28 +90,40 @@ static int q6_ioctl(struct inode *inode, struct file *file,
switch (cmd) {
case AUDIO_SWITCH_DEVICE:
rc = copy_from_user(&id, (void *)arg, sizeof(id));
- if (!rc)
+ if (rc) {
+ pr_err("%s: bad user address\n", __func__);
+ rc = -EFAULT;
+ } else
rc = q6audio_do_routing(id[0], id[1]);
break;
case AUDIO_SET_VOLUME:
rc = copy_from_user(&n, (void *)arg, sizeof(n));
- if (!rc)
+ if (rc) {
+ pr_err("%s: bad user address\n", __func__);
+ rc = -EFAULT;
+ } else
rc = q6audio_set_rx_volume(n);
break;
case AUDIO_SET_MUTE:
rc = copy_from_user(&n, (void *)arg, sizeof(n));
- if (!rc)
+ if (rc) {
+ pr_err("%s: bad user address\n", __func__);
+ rc = -EFAULT;
+ } else
rc = q6audio_set_tx_mute(n);
break;
case AUDIO_UPDATE_ACDB:
rc = copy_from_user(&id, (void *)arg, sizeof(id));
- if (!rc)
+ if (rc) {
+ pr_err("%s: bad user address\n", __func__);
+ rc = -EFAULT;
+ } else
rc = q6audio_update_acdb(id[0], id[1]);
break;
case AUDIO_START_VOICE:
- if (arg == 0) {
+ if (arg == 0)
id[0] = id[1] = 0;
- } else if (copy_from_user(&id, (void*) arg, sizeof(id))) {
+ else if (copy_from_user(&id, (void *)arg, sizeof(id))) {
pr_info("voice: copy acdb_id from user failed\n");
rc = -EFAULT;
break;
@@ -123,10 +135,14 @@ static int q6_ioctl(struct inode *inode, struct file *file,
break;
case AUDIO_REINIT_ACDB:
rc = copy_from_user(&filename, (void *)arg, sizeof(filename));
- if (!rc)
+ if (rc) {
+ pr_err("%s: bad user address\n", __func__);
+ rc = -EFAULT;
+ } else
rc = q6audio_reinit_acdb(filename);
break;
default:
+ pr_info("%s: unknown %d\n", __func__, cmd);
rc = -EINVAL;
}
diff --git a/arch/arm/mach-msm/qdsp6/pcm_out.c b/arch/arm/mach-msm/qdsp6/pcm_out.c
index 11221686566..6d041d8c686 100644
--- a/arch/arm/mach-msm/qdsp6/pcm_out.c
+++ b/arch/arm/mach-msm/qdsp6/pcm_out.c
@@ -56,6 +56,12 @@ static long pcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
switch (cmd) {
case AUDIO_SET_VOLUME: {
int vol;
+ if (!pcm->ac) {
+ pr_err("%s: cannot set volume before AUDIO_START!\n",
+ __func__);
+ rc = -EINVAL;
+ break;
+ }
if (copy_from_user(&vol, (void*) arg, sizeof(vol))) {
rc = -EFAULT;
break;