Commit 4c3ff00f authored by François Romieu's avatar François Romieu Committed by Linus Torvalds

[PATCH] Unchecked copy_to_user disturb harmony

Fix an assortment of unchecked copy_to_user().
parent 0ccf85cf
...@@ -442,9 +442,12 @@ static ssize_t harmony_audio_read(struct file *file, ...@@ -442,9 +442,12 @@ static ssize_t harmony_audio_read(struct file *file,
buf_to_read = harmony.first_filled_record; buf_to_read = harmony.first_filled_record;
/* Copy the page to an aligned buffer */ /* Copy the page to an aligned buffer */
copy_to_user(buffer+count, if (copy_to_user(buffer+count, recorded_buf.addr +
recorded_buf.addr+(HARMONY_BUF_SIZE*buf_to_read), (HARMONY_BUF_SIZE*buf_to_read),
HARMONY_BUF_SIZE); HARMONY_BUF_SIZE)) {
count = -EFAULT;
break;
}
harmony.nb_filled_record--; harmony.nb_filled_record--;
harmony.first_filled_record++; harmony.first_filled_record++;
...@@ -474,13 +477,16 @@ static ssize_t harmony_audio_read(struct file *file, ...@@ -474,13 +477,16 @@ static ssize_t harmony_audio_read(struct file *file,
#define test_rate(tested,real_value,harmony_value) if ((tested)<=(real_value))\ #define test_rate(tested,real_value,harmony_value) if ((tested)<=(real_value))\
static void harmony_format_auto_detect(const char *buffer, int block_size) static int harmony_format_auto_detect(const char *buffer, int block_size)
{ {
u8 file_header[24]; u8 file_header[24];
u32 start_string; u32 start_string;
int ret = 0;
if (block_size>24) { if (block_size>24) {
copy_from_user(file_header, buffer, sizeof(file_header)); if (copy_from_user(file_header, buffer, sizeof(file_header)))
ret = -EFAULT;
start_string = four_bytes_to_u32(0); start_string = four_bytes_to_u32(0);
if ((file_header[4]==0) && (start_string==0x2E736E64)) { if ((file_header[4]==0) && (start_string==0x2E736E64)) {
...@@ -505,7 +511,7 @@ static void harmony_format_auto_detect(const char *buffer, int block_size) ...@@ -505,7 +511,7 @@ static void harmony_format_auto_detect(const char *buffer, int block_size)
default: default:
harmony_set_control(HARMONY_DF_16BIT_LINEAR, harmony_set_control(HARMONY_DF_16BIT_LINEAR,
HARMONY_SR_44KHZ, HARMONY_SS_STEREO); HARMONY_SR_44KHZ, HARMONY_SS_STEREO);
return; goto out;
} }
switch (nb_voices) { switch (nb_voices) {
case HARMONY_MAGIC_MONO: case HARMONY_MAGIC_MONO:
...@@ -520,10 +526,12 @@ static void harmony_format_auto_detect(const char *buffer, int block_size) ...@@ -520,10 +526,12 @@ static void harmony_format_auto_detect(const char *buffer, int block_size)
} }
harmony_set_rate(harmony_detect_rate(&speed)); harmony_set_rate(harmony_detect_rate(&speed));
harmony.dac_rate = speed; harmony.dac_rate = speed;
return; goto out;
} }
} }
harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO); harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO);
out:
return ret;
} }
#undef four_bytes_to_u32 #undef four_bytes_to_u32
...@@ -538,8 +546,10 @@ static ssize_t harmony_audio_write(struct file *file, ...@@ -538,8 +546,10 @@ static ssize_t harmony_audio_write(struct file *file,
int frame_size; int frame_size;
int buf_to_fill; int buf_to_fill;
if (!harmony.format_initialized) if (!harmony.format_initialized) {
harmony_format_auto_detect(buffer, total_count); if (harmony_format_auto_detect(buffer, total_count))
return -EFAULT;
}
while (count<total_count) { while (count<total_count) {
/* Wait until we're out of control mode */ /* Wait until we're out of control mode */
...@@ -573,8 +583,9 @@ static ssize_t harmony_audio_write(struct file *file, ...@@ -573,8 +583,9 @@ static ssize_t harmony_audio_write(struct file *file,
} }
/* Copy the page to an aligned buffer */ /* Copy the page to an aligned buffer */
copy_from_user(played_buf.addr + (HARMONY_BUF_SIZE*buf_to_fill) + harmony.play_offset, if (copy_from_user(played_buf.addr +(HARMONY_BUF_SIZE*buf_to_fill) + harmony.play_offset,
buffer+count, frame_size); buffer+count, frame_size))
return -EFAULT;
CHECK_WBACK_INV_OFFSET(played_buf, (HARMONY_BUF_SIZE*buf_to_fill + harmony.play_offset), CHECK_WBACK_INV_OFFSET(played_buf, (HARMONY_BUF_SIZE*buf_to_fill + harmony.play_offset),
frame_size); frame_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment