summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2020-06-30 18:45:56 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-06-30 18:45:56 +0000
commit80a034455587664f3919f439dcf4e3f625ce8443 (patch)
treec5c8d98809b4b09acfc8ae0445f9c687c4dbbd36
parent3583b98a2d5fc43453a4b47741fbcf94e70858c3 (diff)
parent4a995822bc71fec4f01c9a63328f0d7f2261eb65 (diff)
downloadsonivox-80a034455587664f3919f439dcf4e3f625ce8443.tar.gz
Check data consistency in mdls parsing am: e689e94f3b am: 0a3c762015 am: 2ecaa02926 am: 4a995822bc
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/sonivox/+/11961320 Change-Id: Iba991e9f9a858ddb101737e1f5a5f858b17b6b72
-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 b172881..206861b 100644
--- a/arm-wt-22k/lib_src/eas_mdls.c
+++ b/arm-wt-22k/lib_src/eas_mdls.c
@@ -851,6 +851,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)
@@ -1411,6 +1420,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;
}
@@ -1646,6 +1664,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++;
@@ -1793,6 +1819,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;
}