summaryrefslogtreecommitdiff
path: root/apps/codecs
diff options
context:
space:
mode:
authorMichael Giacomelli <giac2000@hotmail.com>2009-12-14 01:09:01 +0000
committerMichael Giacomelli <giac2000@hotmail.com>2009-12-14 01:09:01 +0000
commitd6ae8edc134e9204044ec7b3113b5fef3122502c (patch)
tree1d95f968859f40f6c93cf3e680604fe250324adb /apps/codecs
parent69a5ff7f8ac16e40e96d5fbe805b9682f627ea19 (diff)
downloadrockbox-d6ae8edc134e9204044ec7b3113b5fef3122502c.zip
rockbox-d6ae8edc134e9204044ec7b3113b5fef3122502c.tar.gz
rockbox-d6ae8edc134e9204044ec7b3113b5fef3122502c.tar.bz2
rockbox-d6ae8edc134e9204044ec7b3113b5fef3122502c.tar.xz
Commit both patches in FS#10833 - Protect against division by zero in AAC (mp4) codec by Juliusz Chroboczek. Adds some return value checking so that faad errors don't crash rockbox when decoding broken or unsupported files.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23983 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs')
-rw-r--r--apps/codecs/aac.c10
-rw-r--r--apps/codecs/libm4a/m4a.c3
2 files changed, 7 insertions, 6 deletions
diff --git a/apps/codecs/aac.c b/apps/codecs/aac.c
index 6046035..7d706f4 100644
--- a/apps/codecs/aac.c
+++ b/apps/codecs/aac.c
@@ -53,6 +53,7 @@ enum codec_status codec_main(void)
int err;
uint32_t s = 0;
unsigned char c = 0;
+ void *ret;
/* Generic codec initialisation */
ci->configure(DSP_SET_STEREO_MODE, STEREO_NONINTERLEAVED);
@@ -179,11 +180,10 @@ next_track:
buffer=ci->request_buffer(&n,sample_byte_size);
/* Decode one block - returned samples will be host-endian */
- NeAACDecDecode(decoder, &frame_info, buffer, n);
- /* Ignore return value, we access samples in the decoder struct
- * directly.
- */
- if (frame_info.error > 0) {
+ ret = NeAACDecDecode(decoder, &frame_info, buffer, n);
+
+ /* NeAACDecDecode may sometimes return NULL without setting error. */
+ if (ret == NULL || frame_info.error > 0) {
LOGF("FAAD: decode error '%s'\n", NeAACDecGetErrorMessage(frame_info.error));
err = CODEC_ERROR;
goto done;
diff --git a/apps/codecs/libm4a/m4a.c b/apps/codecs/libm4a/m4a.c
index f066640..92e619d 100644
--- a/apps/codecs/libm4a/m4a.c
+++ b/apps/codecs/libm4a/m4a.c
@@ -194,7 +194,8 @@ unsigned int get_sample_offset(demux_res_t *demux_res, uint32_t sample)
prev_chunk_samples = demux_res->sample_to_chunk[i].num_samples;
}
- if (sample >= demux_res->sample_to_chunk[0].num_samples)
+ if (prev_chunk_samples > 0 &&
+ sample >= demux_res->sample_to_chunk[0].num_samples)
{
chunk = prev_chunk + (sample - total_samples) / prev_chunk_samples;
}