Free'd variables in case of SciError in the api 38/18138/2
Dhruv Khattar [Thu, 5 May 2016 06:50:06 +0000 (11:50 +0530)]
Change-Id: I2c99606b5d7d30d1604af1d15d55bcaed54da12f

scilab/modules/api_scilab/src/cpp/api_stack_string.cpp

index 976d91f..becdfe7 100644 (file)
@@ -484,6 +484,7 @@ int getAllocatedSingleWideString(void* _pvCtx, int* _piAddress, wchar_t** _pwstD
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedSingleWideString");
         printError(&sciErr, 0);
+        FREE(*_pwstData);
         return sciErr.iErr;
     }
 
@@ -501,7 +502,6 @@ int getAllocatedMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int*
     }
 
     int* piLen = (int*)MALLOC(sizeof(int) **_piRows **_piCols);
-    *_pstData = (char**)MALLOC(sizeof(char*) **_piRows **_piCols);
 
     sciErr = getMatrixOfString(_pvCtx, _piAddress, _piRows, _piCols, piLen, NULL);
     if (sciErr.iErr)
@@ -513,10 +513,10 @@ int getAllocatedMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int*
             FREE(piLen);
             piLen = NULL;
         }
-        FREE(*_pstData);
         return sciErr.iErr;
     }
 
+    *_pstData = (char**)MALLOC(sizeof(char*) **_piRows **_piCols);
     for (int i = 0 ; i < *_piRows **_piCols ; i++)
     {
         (*_pstData)[i] = (char*)MALLOC(sizeof(char) * (piLen[i] + 1));//+1 for null termination
@@ -532,6 +532,10 @@ int getAllocatedMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int*
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfString");
         printError(&sciErr, 0);
+        for (int i = 0 ; i < *_piRows **_piCols ; i++)
+        {
+            FREE((*_pstData)[i]);
+        }
         FREE(*_pstData);
         return sciErr.iErr;
     }
@@ -550,7 +554,6 @@ int getAllocatedMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows,
     }
 
     int* piLen = (int*)MALLOC(sizeof(int) **_piRows **_piCols);
-    *_pwstData = (wchar_t**)MALLOC(sizeof(wchar_t*) **_piRows **_piCols);
 
     sciErr = getMatrixOfWideString(_pvCtx, _piAddress, _piRows, _piCols, piLen, NULL);
     if (sciErr.iErr)
@@ -561,15 +564,11 @@ int getAllocatedMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows,
             FREE(piLen);
             piLen = NULL;
         }
-        if (*_pwstData)
-        {
-            FREE(*_pwstData);
-            *_pwstData = NULL;
-        }
         printError(&sciErr, 0);
         return sciErr.iErr;
     }
 
+    *_pwstData = (wchar_t**)MALLOC(sizeof(wchar_t*) **_piRows **_piCols);
     for (int i = 0 ; i < *_piRows **_piCols ; i++)
     {
         (*_pwstData)[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (piLen[i] + 1));//+1 for null termination
@@ -587,6 +586,11 @@ int getAllocatedMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows,
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfWideString");
         printError(&sciErr, 0);
+        for (int i = 0 ; i < *_piRows **_piCols ; i++)
+        {
+            FREE((*_pwstData)[i]);
+        }
+        FREE(*_pwstData);
         return sciErr.iErr;
     }
     return 0;
@@ -621,6 +625,7 @@ int getAllocatedNamedSingleString(void* _pvCtx, const char* _pstName, char** _ps
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_STRING, _("%s: Unable to get argument data"), "getAllocatedNamedSingleString");
         printError(&sciErr, 0);
+        FREE(*_pstData);
         return sciErr.iErr;
     }
 
@@ -656,6 +661,7 @@ int getAllocatedNamedSingleWideString(void* _pvCtx, const char* _pstName, wchar_
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedNamedSingleWideString");
         printError(&sciErr, 0);
+        FREE(*_pwstData);
         return sciErr.iErr;
     }
 
@@ -703,6 +709,11 @@ int getAllocatedNamedMatrixOfString(void* _pvCtx, const char* _pstName, int* _pi
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfString");
         printError(&sciErr, 0);
+        for (int i = 0 ; i < *_piRows **_piCols ; i++)
+        {
+            FREE((*_pstData)[i]);
+        }
+        FREE(*_pstData);
         return sciErr.iErr;
     }
 
@@ -755,6 +766,11 @@ int getAllocatedNamedMatrixOfWideString(void* _pvCtx, const char* _pstName, int*
     {
         addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfWideString");
         printError(&sciErr, 0);
+        for (int i = 0 ; i < *_piRows **_piCols ; i++)
+        {
+            FREE((*_pwstData)[i]);
+        }
+        FREE(*_pwstData);
         return sciErr.iErr;
     }