aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-01-13 00:52:58 +0100
committerAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-01-28 01:50:35 +0100
commit873a0dfa26dfeda29f5f7539ffd1cd563ce5437c (patch)
tree6f0033976e04a63fd6868c5a11c7d7e9b7cb7097
parentf2fd5b9eb2677eddfe6c9be6b2235390476cfce6 (diff)
downloadffmpeg-873a0dfa26dfeda29f5f7539ffd1cd563ce5437c.tar.gz
dca: fix misaligned access in avpriv_dca_convert_bitstream
src and dst are only 8-bit-aligned, so accessing them as uint16_t causes SIGBUS crashes on architectures like sparc. This fixes ubsan runtime error: load of misaligned address for type 'const uint16_t', which requires 2 byte alignment Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com> (cherry picked from commit 44ac13eed49593f4f8efdb72ab0d5b48e05aa305) Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
-rw-r--r--libavcodec/dca.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/libavcodec/dca.c b/libavcodec/dca.c
index 22be88fe1a..57c65150da 100644
--- a/libavcodec/dca.c
+++ b/libavcodec/dca.c
@@ -40,8 +40,6 @@ int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst,
{
uint32_t mrk;
int i, tmp;
- const uint16_t *ssrc = (const uint16_t *) src;
- uint16_t *sdst = (uint16_t *) dst;
PutBitContext pb;
if ((unsigned) src_size > (unsigned) max_size)
@@ -53,8 +51,11 @@ int avpriv_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst,
memcpy(dst, src, src_size);
return src_size;
case DCA_MARKER_RAW_LE:
- for (i = 0; i < (src_size + 1) >> 1; i++)
- *sdst++ = av_bswap16(*ssrc++);
+ for (i = 0; i < (src_size + 1) >> 1; i++) {
+ AV_WB16(dst, AV_RL16(src));
+ src += 2;
+ dst += 2;
+ }
return src_size;
case DCA_MARKER_14B_BE:
case DCA_MARKER_14B_LE: