[FFmpeg-cvslog] dca: fix misaligned access in avpriv_dca_convert_bitstream
Andreas Cadhalpun
git at videolan.org
Thu Jan 28 00:44:36 CET 2016
ffmpeg | branch: release/2.8 | Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com> | Wed Jan 13 00:52:58 2016 +0100| [1272b88d04574f20aa56e6bbefcdf1405f267401] | committer: Andreas Cadhalpun
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 at niedermayer.cc>
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
(cherry picked from commit 44ac13eed49593f4f8efdb72ab0d5b48e05aa305)
Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1272b88d04574f20aa56e6bbefcdf1405f267401
---
libavcodec/dca.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libavcodec/dca.c b/libavcodec/dca.c
index 8dd0430..714509b 100644
--- a/libavcodec/dca.c
+++ b/libavcodec/dca.c
@@ -41,8 +41,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)
@@ -54,8 +52,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_SYNCWORD_CORE_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_SYNCWORD_CORE_14B_BE:
case DCA_SYNCWORD_CORE_14B_LE:
More information about the ffmpeg-cvslog
mailing list