diff options
author | Robert Kausch <robert.kausch@freac.org> | 2017-04-23 21:31:36 +0200 |
---|---|---|
committer | Robert Kausch <robert.kausch@freac.org> | 2017-04-23 21:31:36 +0200 |
commit | 6b0d8201b1ef4be11b028e7c635dfe6a9c919380 (patch) | |
tree | 16d5bed6f471b5bce3c0cce429a58b87967e75e8 /libFDK/src | |
parent | 5eb6f0db8cc1ecc00af2ef534078e4c65fdf978f (diff) | |
download | fdk-aac-6b0d8201b1ef4be11b028e7c635dfe6a9c919380.tar.gz fdk-aac-6b0d8201b1ef4be11b028e7c635dfe6a9c919380.tar.bz2 fdk-aac-6b0d8201b1ef4be11b028e7c635dfe6a9c919380.zip |
Add checks to avoid overreading supplied buffers and fix issue #61.
Diffstat (limited to 'libFDK/src')
-rw-r--r-- | libFDK/src/FDK_bitbuffer.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/libFDK/src/FDK_bitbuffer.cpp b/libFDK/src/FDK_bitbuffer.cpp index 680ceae..9076d84 100644 --- a/libFDK/src/FDK_bitbuffer.cpp +++ b/libFDK/src/FDK_bitbuffer.cpp @@ -157,6 +157,8 @@ void FDK_ResetBitBuffer ( HANDLE_FDK_BITBUF hBitBuf ) INT FDK_get (HANDLE_FDK_BITBUF hBitBuf, const UINT numberOfBits) { + if (numberOfBits == 0 || numberOfBits > hBitBuf->ValidBits) return 0; + UINT byteOffset = hBitBuf->BitNdx >> 3 ; UINT bitOffset = hBitBuf->BitNdx & 0x07 ; @@ -166,22 +168,20 @@ INT FDK_get (HANDLE_FDK_BITBUF hBitBuf, const UINT numberOfBits) UINT byteMask = hBitBuf->bufSize - 1 ; - UINT tx = (hBitBuf->Buffer [ byteOffset & byteMask] << 24) | - (hBitBuf->Buffer [(byteOffset+1) & byteMask] << 16) | - (hBitBuf->Buffer [(byteOffset+2) & byteMask] << 8) | - hBitBuf->Buffer [(byteOffset+3) & byteMask]; + UINT tx = hBitBuf->Buffer [ byteOffset & byteMask] << 24 << bitOffset; - if (bitOffset) - { - tx <<= bitOffset; - tx |= hBitBuf->Buffer [(byteOffset+4) & byteMask] >> (8-bitOffset); - } + if (numberOfBits + bitOffset > 8) tx |= hBitBuf->Buffer [(byteOffset+1) & byteMask] << 16 << bitOffset; + if (numberOfBits + bitOffset > 16) tx |= hBitBuf->Buffer [(byteOffset+2) & byteMask] << 8 << bitOffset; + if (numberOfBits + bitOffset > 24) tx |= hBitBuf->Buffer [(byteOffset+3) & byteMask] << bitOffset; + if (numberOfBits + bitOffset > 32) tx |= hBitBuf->Buffer [(byteOffset+4) & byteMask] >> (8 - bitOffset); return (tx >> (32 - numberOfBits)) ; } INT FDK_get32 (HANDLE_FDK_BITBUF hBitBuf) { + if (hBitBuf->ValidBits < 32) return 0; + UINT BitNdx = hBitBuf->BitNdx + 32; if (BitNdx <= hBitBuf->bufBits) { |