aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-05-02 02:07:05 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-05-02 02:07:05 +0000
commit9a9f73e24d15e84b8dc6fa19697282455ccc1ebe (patch)
treef7415119aafa57dc0d279e55f1dbb7a81f8dafce
parent344e643d6defaced02b658fbd57ba890c4abbfeb (diff)
parentae56a5c61697ee3f84a42342048516b9f6d9f52c (diff)
downloadtremolo-9a9f73e24d15e84b8dc6fa19697282455ccc1ebe.tar.gz
Snap for 6454413 from ae56a5c61697ee3f84a42342048516b9f6d9f52c to rvc-d1-release
Change-Id: I810353b34eec08de0e800345d3f4ace8e218b0ab
-rw-r--r--TEST_MAPPING6
-rw-r--r--Tremolo/floor0.c17
-rw-r--r--tests/Android.bp34
-rw-r--r--tests/test_floor0.cpp109
4 files changed, 161 insertions, 5 deletions
diff --git a/TEST_MAPPING b/TEST_MAPPING
new file mode 100644
index 0000000..fed9cac
--- /dev/null
+++ b/TEST_MAPPING
@@ -0,0 +1,6 @@
+{
+ "presubmit": [
+ { "name": "oob_oggpack_look" }
+ ]
+}
+
diff --git a/Tremolo/floor0.c b/Tremolo/floor0.c
index b6ece29..7e74d1e 100644
--- a/Tremolo/floor0.c
+++ b/Tremolo/floor0.c
@@ -402,13 +402,20 @@ ogg_int32_t *floor0_inverse1(vorbis_dsp_state *vd,vorbis_info_floor *i,
ogg_int32_t *lsp){
vorbis_info_floor0 *info=(vorbis_info_floor0 *)i;
int j,k;
-
- int ampraw=oggpack_read(&vd->opb,info->ampbits);
+ uint64_t ampraw;
+ if(info->ampbits<=32){
+ ampraw=oggpack_read(&vd->opb,info->ampbits);
+ }else{
+ //max value possible for info->ampbits is 63
+ ampraw=oggpack_read(&vd->opb,info->ampbits-32);
+ ampraw<<=32;
+ ampraw|=oggpack_read(&vd->opb,32);
+ }
if(ampraw>0){ /* also handles the -1 out of data case */
- long maxval=(1<<info->ampbits)-1;
- int amp=((ampraw*info->ampdB)<<4)/maxval;
+ uint64_t maxval=(1<<info->ampbits)-1;
+ float ampRatio=(float)ampraw/maxval;
+ int amp=ampRatio*(info->ampdB<<4);
int booknum=oggpack_read(&vd->opb,_ilog(info->numbooks));
-
if(booknum!=-1 && booknum<info->numbooks){ /* be paranoid */
codec_setup_info *ci=(codec_setup_info *)vd->vi->codec_setup;
codebook *b=ci->book_param+info->books[booknum];
diff --git a/tests/Android.bp b/tests/Android.bp
new file mode 100644
index 0000000..a27c234
--- /dev/null
+++ b/tests/Android.bp
@@ -0,0 +1,34 @@
+cc_test {
+ name: "oob_oggpack_look",
+ gtest: true,
+ test_suites: ["device-tests"],
+
+ srcs: ["test_floor0.cpp"],
+
+ // compile_multilib: "64",
+
+ static_libs: [
+ "libvorbisidec",
+ "liblog",
+ ],
+
+ shared_libs: [
+ "libutils",
+ "liblog",
+ ],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ ],
+
+ sanitize: {
+ integer_overflow: true,
+ misc_undefined: ["bounds"],
+ diag: {
+ integer_overflow: true,
+ undefined: true,
+ misc_undefined: ["bounds"],
+ },
+ },
+}
diff --git a/tests/test_floor0.cpp b/tests/test_floor0.cpp
new file mode 100644
index 0000000..a3a8eb3
--- /dev/null
+++ b/tests/test_floor0.cpp
@@ -0,0 +1,109 @@
+/*
+ * test case not really written for gtest, but wrapped so it'll cooperate.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "Utils_test"
+
+#include <gtest/gtest.h>
+
+#include <string.h>
+#define REF_COUNT 1
+#define DECODE_PACKET 1
+
+extern "C" {
+#include <Tremolo/codec_internal.h>
+
+int _vorbis_unpack_books(vorbis_info *vi, oggpack_buffer *opb);
+int _vorbis_unpack_info(vorbis_info *vi, oggpack_buffer *opb);
+int _vorbis_unpack_comment(vorbis_comment *vc, oggpack_buffer *opb);
+}
+
+const uint8_t packInfoData[] = { 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0xBB, 0x00,
+ 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xBB, 0x01, 0xFF, 0xFF, 0xFF, 0xFF };
+
+unsigned char unpackBookData[] = { 0x00, 0x42, 0x43, 0x56, 0x1E, 0x00, 0x10,
+ 0x00, 0x00, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x10, 0x0A, 0xFF, 0x00, 0x00,
+ 0x00, 0x06, 0xD0, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1D, 0x00, 0x00, 0x00,
+ 0x2C, 0x00, 0x03, 0x3C, 0x51, 0x04, 0x34, 0x4F, 0x04, 0x00, 0x40, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xCB, 0x00, 0x40, 0x00, 0x00, 0x01, 0x4F, 0xF4,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF };
+
+unsigned char bufData[] = { 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xE7,
+ 0x00, 0x00, 0xE9, 0x00 };
+
+static void makeBitReader(const void *data, size_t size, ogg_buffer *buf,
+ ogg_reference *ref, oggpack_buffer *bits) {
+ buf->data = (uint8_t *) data;
+ buf->size = size;
+ buf->refcount = REF_COUNT;
+
+ ref->buffer = buf;
+ ref->length = size;
+ oggpack_readinit(bits, ref);
+}
+
+// below here is where we're trying to bridge the gtest and non-gtest world
+
+namespace android {
+
+class Floor0Test : public ::testing::Test {
+};
+
+//
+// the test, since it compiles with ubsan, should fault and die if the patch
+// is not in place. at least that's the idea.
+TEST_F(Floor0Test, Test1) {
+
+ ogg_buffer buf;
+ ogg_reference ref;
+ oggpack_buffer bits;
+
+ memset(&buf, 0, sizeof(ogg_buffer));
+ memset(&ref, 0, sizeof(ogg_reference));
+ memset(&bits, 0, sizeof(oggpack_buffer));
+
+ makeBitReader(packInfoData, sizeof(packInfoData), &buf, &ref, &bits);
+
+ vorbis_info *mVi = new vorbis_info;
+ vorbis_info_init(mVi);
+
+ int ret = _vorbis_unpack_info(mVi, &bits);
+ if (!ret) {
+ memset(&buf, 0, sizeof(ogg_buffer));
+ memset(&ref, 0, sizeof(ogg_reference));
+ memset(&bits, 0, sizeof(oggpack_buffer));
+
+ makeBitReader(unpackBookData, sizeof(unpackBookData), &buf, &ref,
+ &bits);
+
+ ret = _vorbis_unpack_books(mVi, &bits);
+ if (!ret) {
+ ogg_packet pack;
+ memset(&pack, 0, sizeof(ogg_packet));
+ memset(&buf, 0, sizeof(ogg_buffer));
+ memset(&ref, 0, sizeof(ogg_reference));
+
+ vorbis_dsp_state *mState = new vorbis_dsp_state;
+ vorbis_dsp_init(mState, mVi);
+
+ buf.data = bufData;
+ buf.size = sizeof(bufData);
+ buf.refcount = REF_COUNT;
+
+ ref.buffer = &buf;
+ ref.length = buf.size;
+
+ pack.packet = &ref;
+ pack.bytes = ref.length;
+
+ vorbis_dsp_synthesis(mState, &pack, DECODE_PACKET);
+ }
+ }
+}
+
+} // namespace android