Mercurial > libavcodec.hg
changeset 9905:f3ff182e9ecf libavcodec
Fix potentially unaligned accesses in ff_copy_bits()
A pointer should never be assigned a value which may have less than the
required alignment of the target type. Compilers may assume pointer
values have the required alignment, and emit normal load/store instructions.
Unaligned pointers should use a character type or compiler-specific
type modifiers.
author | mru |
---|---|
date | Wed, 01 Jul 2009 17:48:22 +0000 |
parents | efd0c5014ac7 |
children | fe4e6d8242d4 |
files | bitstream.c |
diffstat | 1 files changed, 2 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/bitstream.c Wed Jul 01 17:29:52 2009 +0000 +++ b/bitstream.c Wed Jul 01 17:48:22 2009 +0000 @@ -78,7 +78,6 @@ void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length) { - const uint16_t *srcw= (const uint16_t*)src; int words= length>>4; int bits= length&15; int i; @@ -86,7 +85,7 @@ if(length==0) return; if(CONFIG_SMALL || words < 16 || put_bits_count(pb)&7){ - for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(&srcw[i])); + for(i=0; i<words; i++) put_bits(pb, 16, AV_RB16(src + 2*i)); }else{ for(i=0; put_bits_count(pb)&31; i++) put_bits(pb, 8, src[i]); @@ -95,7 +94,7 @@ skip_put_bytes(pb, 2*words-i); } - put_bits(pb, bits, AV_RB16(&srcw[words])>>(16-bits)); + put_bits(pb, bits, AV_RB16(src + 2*words)>>(16-bits)); } /* VLC decoding */