summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2020-06-30 18:01:05 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-06-30 18:01:05 +0000
commit0a3c76201510bfd08cfb3f89423d7906e9a212cc (patch)
treecbee70b04852ed2a4d9e2cc963558b8cb931d6c6
parent1af91e35b629944821f4b82aca3a02e8ca6bcb67 (diff)
parente689e94f3b7473497052e81d906a10a82407e559 (diff)
downloadsonivox-0a3c76201510bfd08cfb3f89423d7906e9a212cc.tar.gz
Check data consistency in mdls parsing am: e689e94f3b
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/sonivox/+/11961320 Change-Id: Ib67171a0a225c258ff110cbe33aca249814d1299
-rw-r--r--arm-wt-22k/host_src/eas_types.h1
-rw-r--r--arm-wt-22k/lib_src/eas_mdls.c32
2 files changed, 33 insertions, 0 deletions
diff --git a/arm-wt-22k/host_src/eas_types.h b/arm-wt-22k/host_src/eas_types.h
index df1d1d8..56d0b53 100644
--- a/arm-wt-22k/host_src/eas_types.h
+++ b/arm-wt-22k/host_src/eas_types.h
@@ -76,6 +76,7 @@ typedef long EAS_RESULT;
#define EAS_ERROR_QUEUE_IS_FULL -36
#define EAS_ERROR_QUEUE_IS_EMPTY -37
#define EAS_ERROR_FEATURE_ALREADY_ACTIVE -38
+#define EAS_ERROR_DATA_INCONSISTENCY -39
/* special return codes */
#define EAS_EOF 3
diff --git a/arm-wt-22k/lib_src/eas_mdls.c b/arm-wt-22k/lib_src/eas_mdls.c
index 0c1c9f6..bfe54d3 100644
--- a/arm-wt-22k/lib_src/eas_mdls.c
+++ b/arm-wt-22k/lib_src/eas_mdls.c
@@ -850,6 +850,15 @@ static EAS_RESULT Parse_ptbl (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_
if ((result = EAS_HWGetDWord(pDLSData->hwInstData, pDLSData->fileHandle, &pDLSData->waveCount, EAS_FALSE)) != EAS_SUCCESS)
return result;
+ /* if second pass, ensure waveCount matches with the value parsed in first pass */
+ if (pDLSData->pDLS)
+ {
+ if (pDLSData->waveCount != pDLSData->pDLS->numDLSSamples)
+ {
+ return EAS_ERROR_DATA_INCONSISTENCY;
+ }
+ }
+
#if 0
/* just need the wave count on the first pass */
if (!pDLSData->pDLS)
@@ -1361,6 +1370,15 @@ static EAS_RESULT Parse_lins (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_
if (temp != CHUNK_INS)
continue;
+ /* if second pass, ensure instCount is less than numDLSPrograms */
+ if (pDLSData->pDLS)
+ {
+ if (pDLSData->instCount >= pDLSData->pDLS->numDLSPrograms)
+ {
+ return EAS_ERROR_DATA_INCONSISTENCY;
+ }
+ }
+
if ((result = Parse_ins(pDLSData, chunkPos + 12, size)) != EAS_SUCCESS)
return result;
}
@@ -1596,6 +1614,14 @@ static EAS_RESULT Parse_lrgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_
{ /* dpp: EAS_ReportEx(_EAS_SEVERITY_WARNING, "DLS region count exceeded cRegions value in insh, extra region ignored\n"); */ }
return EAS_SUCCESS;
}
+ /* if second pass, ensure regionCount is less than numDLSRegions */
+ if (pDLSData->pDLS)
+ {
+ if (pDLSData->regionCount >= pDLSData->pDLS->numDLSRegions)
+ {
+ return EAS_ERROR_DATA_INCONSISTENCY;
+ }
+ }
if ((result = Parse_rgn(pDLSData, chunkPos + 12, size, artIndex)) != EAS_SUCCESS)
return result;
regionCount++;
@@ -1743,6 +1769,12 @@ static EAS_RESULT Parse_rgn (SDLS_SYNTHESIZER_DATA *pDLSData, EAS_I32 pos, EAS_I
/* if local data was found convert it */
if (art.values[PARAM_MODIFIED] == EAS_TRUE)
{
+ /* ensure artCount is less than numDLSArticulations */
+ if (pDLSData->artCount >= pDLSData->pDLS->numDLSArticulations)
+ {
+ return EAS_ERROR_DATA_INCONSISTENCY;
+ }
+
Convert_art(pDLSData, &art, (EAS_U16) pDLSData->artCount);
artIndex = (EAS_U16) pDLSData->artCount;
}