api_scilab: fix memory leak on SciErr structs 53/10953/3
Simon Marchetto [Fri, 22 Mar 2013 11:36:44 +0000 (12:36 +0100)]
Change-Id: I098ecc5949c77d38025b22c21f8e50eadb91bd63
Cause: addErrorMessage allocates memory for SciErr error messages but sciErr are never freed.
Fix: use static buffers to store SciErr error messages.

scilab/modules/api_scilab/includes/api_common.h
scilab/modules/api_scilab/src/cpp/api_error.cpp

index 4420fcc..37e61d0 100644 (file)
@@ -27,12 +27,13 @@ extern "C" {
      */
 
 #define MESSAGE_STACK_SIZE 5
+#define ERROR_MESSAGE_SIZE 4096
 
     typedef struct api_Err
     {
         int iErr; /**< The error ID */
         int iMsgCount; /**< Error level */
-        char* pstMsg[MESSAGE_STACK_SIZE]; /**< The error message */
+        char pstMsg[MESSAGE_STACK_SIZE][ERROR_MESSAGE_SIZE]; /**< The error message */
     } SciErr;
 
     typedef struct api_Ctx
@@ -53,7 +54,7 @@ extern "C" {
 #include "api_scilab.h"
     /* generics functions */
 
-/*Rhs*/
+    /*Rhs*/
     int* getNbInputArgument(void* _pvCtx);
 #define nbInputArgument(PVCTX) (*getNbInputArgument(PVCTX))
 
@@ -62,7 +63,7 @@ extern "C" {
 #endif
 #define Rhs (*getNbInputArgument(pvApiCtx))
 
-/*Top*/
+    /*Top*/
     int* getNbArgumentOnStack(void* _pvCtx);
 #define nbArgumentOnStack(PVCTX) (*getNbArgumentOnStack(PVCTX))
 
@@ -71,7 +72,7 @@ extern "C" {
 #endif
 #define Top (*getNbArgumentOnStack(pvApiCtx))
 
-/*Lhs*/
+    /*Lhs*/
     int* getNbOutputArgument(void* _pvCtx);
 #define nbOutputArgument(PVCTX) (*getNbOutputArgument(PVCTX))
 #ifdef Lhs
@@ -79,7 +80,7 @@ extern "C" {
 #endif
 #define Lhs (*getNbOutputArgument(pvApiCtx))
 
-/*PutLhs*/
+    /*PutLhs*/
     int* assignOutputVariable(void* _pvCtx, int _iVal);
 #define AssignOutputVariable(PVCTX, x) (*assignOutputVariable(PVCTX, x))
 #ifdef LhsVar
@@ -87,7 +88,7 @@ extern "C" {
 #endif
 #define LhsVar(x) (*assignOutputVariable(pvApiCtx, x))
 
-/*PutLhsVar*/
+    /*PutLhsVar*/
     int returnArguments(void* _pvCtx);
 #define ReturnArguments(PVCTX) if (! returnArguments(PVCTX)) { return 0; }
 #ifdef PutLhsVar
index afe9f8d..c9119b1 100644 (file)
@@ -80,16 +80,15 @@ int addErrorMessage(SciErr* _psciErr, int _iErr, const char* _pstMsg, ...)
     if (_psciErr->iMsgCount >= MESSAGE_STACK_SIZE)
     {
         // no more space, shift error messages
-        FREE(_psciErr->pstMsg[0]);
         for (int i = 1; i < MESSAGE_STACK_SIZE; i++)
         {
-            _psciErr->pstMsg[i - 1] = _psciErr->pstMsg[i];
+            strcpy(_psciErr->pstMsg[i - 1], _psciErr->pstMsg[i]);
         }
-        _psciErr->pstMsg[MESSAGE_STACK_SIZE - 1] = strdup(pstMsg);
+        strcpy(_psciErr->pstMsg[MESSAGE_STACK_SIZE - 1], pstMsg);
     }
     else
     {
-        _psciErr->pstMsg[_psciErr->iMsgCount++] = strdup(pstMsg);
+        strcpy(_psciErr->pstMsg[_psciErr->iMsgCount++], pstMsg);
     }
 
     _psciErr->iErr = _iErr;