diff options
author | Dave Chapman <dave@dchapman.com> | 2006-01-29 01:31:28 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2006-01-29 01:31:28 +0000 |
commit | b0302f0cbb4674d9ff1584b87628f2bfaafa7a0a (patch) | |
tree | 9d6cf90f1380c244736f3a82665a7a9f56cfcd04 /apps/codecs/flac.c | |
parent | 281403a4d839924df41480fc020f401211a6e88b (diff) | |
download | rockbox-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.c | 20 |
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; |