aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2021-04-30 22:21:20 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-04-30 22:21:20 +0000
commit4f432296b929a6207410bafe476598e28167311f (patch)
tree3e9cb675826da8ebaa5e907774aca7247ac46f73
parenta8f6f5847e54b9b41d3e43dec719d0ff12c3021d (diff)
parentb0a46baf901eddf99010e551f069ed5bb358c268 (diff)
downloadfdk-aac-4f432296b929a6207410bafe476598e28167311f.tar.gz
fdk-aac-4f432296b929a6207410bafe476598e28167311f.tar.bz2
fdk-aac-4f432296b929a6207410bafe476598e28167311f.zip
Merge "Prevent signed integer overflow in calc_qmfBufferReal()." into sc-dev am: b0a46baf90
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/aac/+/14387477 Change-Id: Iff2c573663790abf3cd5695ec7a00e89bfd2eaa5
-rw-r--r--libSBRdec/src/lpp_tran.cpp28
1 files changed, 14 insertions, 14 deletions
diff --git a/libSBRdec/src/lpp_tran.cpp b/libSBRdec/src/lpp_tran.cpp
index bdbafa6..113b1de 100644
--- a/libSBRdec/src/lpp_tran.cpp
+++ b/libSBRdec/src/lpp_tran.cpp
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -216,19 +216,21 @@ static inline void calc_qmfBufferReal(FIXP_DBL **qmfBufferReal,
const FIXP_DBL *const lowBandReal,
const int startSample,
const int stopSample, const UCHAR hiBand,
- const int dynamicScale, const int descale,
+ const int dynamicScale,
const FIXP_SGL a0r, const FIXP_SGL a1r) {
- FIXP_DBL accu1, accu2;
- int i;
+ const int dynscale = fixMax(0, dynamicScale - 1) + 1;
+ const int rescale = -fixMin(0, dynamicScale - 1) + 1;
+ const int descale =
+ fixMin(DFRACT_BITS - 1, LPC_SCALE_FACTOR + dynamicScale + rescale);
+
+ for (int i = 0; i < stopSample - startSample; i++) {
+ FIXP_DBL accu;
- for (i = 0; i < stopSample - startSample; i++) {
- accu1 = fMultDiv2(a1r, lowBandReal[i]);
- accu1 = (fMultDiv2(a0r, lowBandReal[i + 1]) + accu1);
- accu1 = accu1 >> dynamicScale;
+ accu = fMultDiv2(a1r, lowBandReal[i]) + fMultDiv2(a0r, lowBandReal[i + 1]);
+ accu = (lowBandReal[i + 2] >> descale) + (accu >> dynscale);
- accu1 <<= 1;
- accu2 = (lowBandReal[i + 2] >> descale);
- qmfBufferReal[i + startSample][hiBand] = accu1 + accu2;
+ qmfBufferReal[i + startSample][hiBand] =
+ SATURATE_LEFT_SHIFT(accu, rescale, DFRACT_BITS);
}
}
@@ -810,9 +812,7 @@ void lppTransposer(
FDK_ASSERT(dynamicScale >= 0);
calc_qmfBufferReal(
qmfBufferReal, &(lowBandReal[LPC_ORDER + startSample - 2]),
- startSample, stopSample, hiBand, dynamicScale,
- fMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)), a0r,
- a1r);
+ startSample, stopSample, hiBand, dynamicScale, a0r, a1r);
}
} /* bw <= 0 */