aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXi Wang <xi.wang@gmail.com>2013-03-15 06:31:21 -0400
committerLuca Barbato <lu_zero@gentoo.org>2013-03-15 13:33:25 +0100
commit12d8ae297911c3020f4d3c1c34967a47b30fb8aa (patch)
tree8ce38f19c5dd610261577dbd2105af1f0cf7b10b
parent0076639965a0970512296342d1f6c38ce990661e (diff)
downloadffmpeg-12d8ae297911c3020f4d3c1c34967a47b30fb8aa.tar.gz
atrac3: avoid oversized shifting in decode_bytes()
When `off' is 0, `0x537F6103 << 32' in the following expression invokes undefined behavior, the result of which is not necessarily 0. (0x537F6103 >> (off * 8)) | (0x537F6103 << (32 - (off * 8))) Avoid oversized shifting. CC: libav-stable@libav.org Signed-off-by: Xi Wang <xi.wang@gmail.com> Signed-off-by: Luca Barbato <lu_zero@gentoo.org> (cherry picked from commit eba1ff31304e407db3cefd7532108408f364367b) Conflicts: libavcodec/atrac3.c
-rw-r--r--libavcodec/atrac3.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c
index 107c6ffeb0..40a44c706a 100644
--- a/libavcodec/atrac3.c
+++ b/libavcodec/atrac3.c
@@ -184,8 +184,11 @@ static int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){
uint32_t* obuf = (uint32_t*) out;
off = (intptr_t)inbuffer & 3;
- buf = (const uint32_t*) (inbuffer - off);
- c = av_be2ne32((0x537F6103 >> (off*8)) | (0x537F6103 << (32-(off*8))));
+ buf = (const uint32_t *)(inbuffer - off);
+ if (off)
+ c = av_be2ne32((0x537F6103U >> (off * 8)) | (0x537F6103U << (32 - (off * 8))));
+ else
+ c = av_be2ne32(0x537F6103U);
bytes += 3 + off;
for (i = 0; i < bytes/4; i++)
obuf[i] = c ^ buf[i];