summaryrefslogtreecommitdiffstats
path: root/apps/codecs/flac.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2006-01-29 01:31:28 +0000
committerDave Chapman <dave@dchapman.com>2006-01-29 01:31:28 +0000
commitb0302f0cbb4674d9ff1584b87628f2bfaafa7a0a (patch)
tree9d6cf90f1380c244736f3a82665a7a9f56cfcd04 /apps/codecs/flac.c
parent281403a4d839924df41480fc020f401211a6e88b (diff)
downloadrockbox-b0302f0cbb4674d9ff1584b87628f2bfaafa7a0a.tar.gz
rockbox-b0302f0cbb4674d9ff1584b87628f2bfaafa7a0a.zip
Prevent unaligned memory accesses whilst reading seektable - fixes FLAC playback on iPod
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8477 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/flac.c')
-rw-r--r--apps/codecs/flac.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/apps/codecs/flac.c b/apps/codecs/flac.c
index 4782c95d55..fa263c1095 100644
--- a/apps/codecs/flac.c
+++ b/apps/codecs/flac.c
@@ -86,7 +86,6 @@ static bool flac_init(FLACContext* fc, int first_frame_offset)
int endofmetadata=0;
int blocklength;
int n;
- uint32_t* p;
ci->memset(fc,0,sizeof(FLACContext));
nseekpoints=0;
@@ -152,12 +151,19 @@ static bool flac_init(FLACContext* fc, int first_frame_offset)
if (n < 18) return false;
blocklength-=n;
- p=(uint32_t*)buf;
- seekpoint_hi=betoh32(*(p++));
- seekpoint_lo=betoh32(*(p++));
- offset_hi=betoh32(*(p++));
- offset_lo=betoh32(*(p++));
-
+ seekpoint_hi=(buf[0] << 24) | (buf[1] << 16) |
+ (buf[2] << 8) | buf[3];
+ seekpoint_lo=(buf[4] << 24) | (buf[5] << 16) |
+ (buf[6] << 8) | buf[7];
+ offset_hi=(buf[8] << 24) | (buf[9] << 16) |
+ (buf[10] << 8) | buf[11];
+ offset_lo=(buf[12] << 24) | (buf[13] << 16) |
+ (buf[14] << 8) | buf[15];
+
+ /* The final two bytes contain the number of samples in the
+ target frame - but we don't care about that. */
+
+ /* Only store seekpoints where the high 32 bits are zero */
if ((seekpoint_hi == 0) && (seekpoint_lo != 0xffffffff) &&
(offset_hi == 0)) {
seekpoints[nseekpoints].sample=seekpoint_lo;