Fix Issue with FC_suspend Resource Array Size 3.40.01.03_eng 3.40.01.04
authorAngela Stegmaier <angelabaker@ti.com>
Tue, 28 Jul 2015 18:10:46 +0000 (13:10 -0500)
committerChris Ring <cring@ti.com>
Tue, 28 Jul 2015 18:54:25 +0000 (11:54 -0700)
The size of the array passed to RMAN_getResman was fixed to 10.
So, if the algorithm was using more than 10 resources, stack corruption
would result. Since there is no limit on the max number of resources
that an algorithm may have, the array size should not be fixed.

This patch fixes the issue by making the size of the array to match
the actual number of resources used by the algorithm.

Signed-off-by: Angela Stegmaier <angelabaker@ti.com>
packages/ti/sdo/fc/rman/rman.c
packages/ti/sdo/fc/utils/fcutils.c

index 35d3e9943b04c956c93967e5c7e997f5667c76a8..580b7a1de707e4ac4499178f1937f6379bcb1d2e 100644 (file)
@@ -1257,6 +1257,11 @@ IRES_Status RMAN_deactivateAllResources(IALG_Handle alg, IRES_Fxns * resFxns,
     return (status);
 }
 
+Int  RMAN_getNumResources(IALG_Handle alg, IRES_Fxns * resFxns)
+{
+    return (resFxns->numResourceDescriptors)(alg);
+}
+
 Int  RMAN_getResman(IALG_Handle alg,
                 IRES_Fxns * resFxns, IRESMAN_Fxns ** resmanList)
 {
index 3babe76dc9d25af116db39315cb6591572360639..4a2cf70ed5375e6d7398163654b3320852dc8824 100644 (file)
@@ -46,6 +46,7 @@
 
 extern IRES_Fxns * RMAN_getIresEntry(IALG_Handle alg);
 extern IALG_Fxns * RMAN_getIAlgEntry(IRES_Fxns * alg);
+extern Int RMAN_getNumResources(IALG_Handle alg, IRES_Fxns * resFxns);
 extern Int RMAN_getResman(IALG_Handle alg, IRES_Fxns * resFxns,
         IRESMAN_Fxns ** resmanList);
 
@@ -74,7 +75,8 @@ Void FC_suspend()
     int n = 0;
     IRES_Fxns * resFxns = NULL;
     int numResman = 0;
-    IRESMAN_Fxns * resmanList[10];
+    IRESMAN_Fxns ** resmanList;
+    int numFxns = 0;
 
     _FC_heap = (xdc_runtime_IHeap_Handle)_DSKT2_heap ;
 
@@ -116,6 +118,16 @@ Void FC_suspend()
             continue;
         }
 
+        numFxns = RMAN_getNumResources(algList[i], resFxns);
+        resmanList = myMalloc(_FC_heap, sizeof(IRESMAN_Fxns *) * numFxns, 0);
+        if (resmanList == NULL) {
+            /* Unable to allocate resmanList, so we can't
+             * deactivate the resources. Deactivate the alg
+             * and move on to the next one */
+            DSKT2_deactivateAlg(scratchIds[i], algList[i]);
+            continue;
+        }
+
         /* RMAN_activateAllResources */
         RMAN_activateAllResources(algList[i], resFxns, scratchIds[i]);
 
@@ -131,6 +143,9 @@ Void FC_suspend()
 
         }
 
+        myFree(_FC_heap, resmanList, sizeof(IRESMAN_Fxns *) * numFxns);
+        resmanList = NULL;
+
         /* Deactivate these again */
         RMAN_deactivateAllResources(algList[i], resFxns, scratchIds[i]);