Browse Source

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
tags/v0.6
Jeff Downs 16 years ago
parent
commit
d468ff0fdf
1 changed files with 5 additions and 1 deletions
  1. +5
    -1
      libavutil/crc.c

+ 5
- 1
libavutil/crc.c View File

@@ -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; const uint8_t *end= buffer+length;


#if !CONFIG_SMALL #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){ while(buffer<end-3){
crc ^= le2me_32(*(const uint32_t*)buffer); buffer+=4; crc ^= le2me_32(*(const uint32_t*)buffer); buffer+=4;
crc = ctx[3*256 + ( crc &0xFF)] 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[1*256 + ((crc>>16)&0xFF)]
^ctx[0*256 + ((crc>>24) )]; ^ctx[0*256 + ((crc>>24) )];
} }
}
#endif #endif
while(buffer<end) while(buffer<end)
crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8); crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8);


Loading…
Cancel
Save