aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Downs <heydowns@borg.com>2009-06-12 02:13:12 +0000
committerJeff Downs <heydowns@borg.com>2009-06-12 02:13:12 +0000
commitd468ff0fdfdd3ff8f54adea3dd1ef4b94cb8538d (patch)
tree8b09325ac0e514d31659eaf1ef76496ff4c5a9c8
parentbe43ae66517272dc2d9e7420df6931e622d9e4bc (diff)
downloadffmpeg-d468ff0fdfdd3ff8f54adea3dd1ef4b94cb8538d.tar.gz
Fix cast of byte buffer to uint32 that was disregarding alignment
requirements. Now calculates crc byte at a time until aligned, then continues with uint32 optimized calculation. This fixes crashes during mlp decoding on sparc (at least, maybe others). Originally committed as revision 19160 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavutil/crc.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/libavutil/crc.c b/libavutil/crc.c
index ed065d8d50..6fa14fcc58 100644
--- a/libavutil/crc.c
+++ b/libavutil/crc.c
@@ -115,7 +115,10 @@ uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t le
const uint8_t *end= buffer+length;
#if !CONFIG_SMALL
- if(!ctx[256])
+ if(!ctx[256]) {
+ while(((intptr_t) buffer & 3) && buffer < end)
+ crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8);
+
while(buffer<end-3){
crc ^= le2me_32(*(const uint32_t*)buffer); buffer+=4;
crc = ctx[3*256 + ( crc &0xFF)]
@@ -123,6 +126,7 @@ uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t le
^ctx[1*256 + ((crc>>16)&0xFF)]
^ctx[0*256 + ((crc>>24) )];
}
+ }
#endif
while(buffer<end)
crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8);