* Bug #11550 fixed - Closing the scope graph while running simulation led to a 48/8348/2
Clément DAVID [Thu, 26 Jul 2012 11:58:09 +0000 (13:58 +0200)]
                     segfault.

Change-Id: Id48811f85da6140738cf010e7a3bb968c6a7998f

14 files changed:
scilab/CHANGES_5.4.X
scilab/modules/graphic_objects/src/cpp/getGraphicObjectProperty.cpp
scilab/modules/graphic_objects/src/cpp/setGraphicObjectProperty.cpp
scilab/modules/scicos_blocks/src/c/bouncexy.c
scilab/modules/scicos_blocks/src/c/canimxy.c
scilab/modules/scicos_blocks/src/c/canimxy3d.c
scilab/modules/scicos_blocks/src/c/cevscpe.c
scilab/modules/scicos_blocks/src/c/cfscope.c
scilab/modules/scicos_blocks/src/c/cmat3d.c
scilab/modules/scicos_blocks/src/c/cmatview.c
scilab/modules/scicos_blocks/src/c/cmscope.c
scilab/modules/scicos_blocks/src/c/cscope.c
scilab/modules/scicos_blocks/src/c/cscopxy.c
scilab/modules/scicos_blocks/src/c/cscopxy3d.c

index 5a332c3..fb71075 100644 (file)
@@ -23,6 +23,9 @@ Xcos
 
 * Bug #11518 fixed - When zooming on CLR block-text, the block was outside the box.
 
+* Bug #11550 fixed - Closing the scope graph while running simulation led to a
+                     segfault.
+
 
 Preferences
 ===========
index 1a4377d..0347795 100644 (file)
@@ -26,6 +26,11 @@ using namespace org_scilab_modules_graphic_objects;
 
 void getGraphicObjectProperty(char const* _pstID, char const* _pstName, _ReturnType_ _returnType, void **_pvData)
 {
+    // do not perform anything if the id is undefined
+    if (_pstID == NULL)
+    {
+        return;
+    }
 
     /* All the Data model properties have the DATA_MODEL prefix */
     if (strncmp(_pstName, __GO_DATA_MODEL__, strlen(__GO_DATA_MODEL__)) == 0)
index 7ad13da..9b5e816 100644 (file)
@@ -27,6 +27,12 @@ using namespace org_scilab_modules_graphic_objects;
 
 void setGraphicObjectRelationship(char const* _parentId, char const* _childId)
 {
+    // do not perform anything if the id is undefined
+    if (_parentId == NULL || _childId == NULL)
+    {
+        return;
+    }
+
     CallGraphicController::setGraphicObjectRelationship(getScilabJavaVM(), _parentId, _childId);
 }
 
@@ -38,6 +44,13 @@ BOOL setGraphicObjectProperty(char const* _pstID, char const* _pstName, void con
     int intValue = 0;
     BOOL boolValue = FALSE;
 
+    // do not perform anything if the id is undefined
+    if (_pstID == NULL)
+    {
+        return FALSE;
+    }
+
+
     // Special Case for data, no need to go through Java.
     if (strncmp(_pstName, __GO_DATA_MODEL__, strlen(__GO_DATA_MODEL__)) == 0)
     {
index 3a0e6d3..88b29d8 100644 (file)
@@ -295,6 +295,7 @@ static void freeScoData(scicos_block * block)
         sco->scope.cachedAxeUID = NULL;
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -365,6 +366,12 @@ static char const* getFigure(scicos_block * block)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -416,6 +423,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -467,6 +480,12 @@ static char *getArc(char *pAxeUID, scicos_block * block, int row)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedArcsUIDs != NULL && sco->scope.cachedArcsUIDs[row] != NULL)
     {
index fa50d07..196f23b 100644 (file)
@@ -306,6 +306,7 @@ static void freeScoData(scicos_block * block)
         sco->scope.cachedAxeUID = NULL;
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -437,6 +438,12 @@ static char const* getFigure(scicos_block * block)
     int i__1 = 1;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -493,6 +500,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
     int i;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -545,6 +558,12 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPolylinesUIDs != NULL && sco->scope.cachedPolylinesUIDs[row] != NULL)
     {
index 2f7f66a..217a4bb 100644 (file)
@@ -310,6 +310,7 @@ static void freeScoData(scicos_block * block)
         sco->scope.cachedAxeUID = NULL;
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -449,6 +450,12 @@ static char const* getFigure(scicos_block * block)
     int i__1 = 1;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -507,6 +514,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
     int i;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -559,6 +572,12 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPolylinesUIDs != NULL && sco->scope.cachedPolylinesUIDs[row] != NULL)
     {
index 998a5a2..e90b749 100644 (file)
@@ -350,6 +350,7 @@ static void freeScoData(scicos_block * block)
         FREE(sco->scope.cachedAxeUID);
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -563,6 +564,12 @@ static char const* getFigure(scicos_block * block)
     int i__1 = 1;
     sco_data *sco = getScoData(block);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -621,6 +628,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
     int nclk = block->nipar - 6;
     sco_data *sco = getScoData(block);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -672,6 +685,12 @@ static char *getSegs(char *pAxeUID, scicos_block * block, int input)
 
     sco_data *sco = getScoData(block);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedSegsUIDs != NULL && sco->scope.cachedSegsUIDs[input] != NULL)
     {
index a89156f..3caa266 100644 (file)
@@ -360,6 +360,7 @@ static void freeScoData(scicos_block * block)
         FREE(sco->scope.cachedAxeUID);
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -548,6 +549,12 @@ static char const* getFigure(scicos_block * block)
 
     int i;
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -608,6 +615,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block, int input)
     sco_data *sco = (sco_data *) * (block->work);
     int links_count = block->ipar[15];
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -658,6 +671,12 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPolylinesUIDs != NULL && sco->scope.cachedPolylinesUIDs[row] != NULL)
     {
index 586f27b..bc70e7c 100644 (file)
@@ -245,9 +245,11 @@ static void freeScoData(scicos_block * block)
     {
         FREE(sco->scope.cachedAxeUID);
         FREE(sco->scope.cachedPlot3dUID);
-    }
 
-    FREE(sco);
+
+        FREE(sco);
+        *(block->work) = NULL;
+    }
 }
 
 static BOOL pushData(scicos_block * block, double *data)
@@ -291,6 +293,12 @@ static char const* getFigure(scicos_block * block)
     int i__1 = 1;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
 
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
@@ -347,6 +355,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
     int i__1 = 1;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -388,6 +402,12 @@ static char *getPlot3d(char *pAxeUID, scicos_block * block)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPlot3dUID != NULL)
     {
index 22355b2..7cb2342 100644 (file)
@@ -240,9 +240,10 @@ static void freeScoData(scicos_block * block)
     {
         FREE(sco->scope.cachedAxeUID);
         FREE(sco->scope.cachedGrayplotUID);
-    }
 
-    FREE(sco);
+        FREE(sco);
+        *(block->work) = NULL;
+    }
 }
 
 static BOOL pushData(scicos_block * block, double *data)
@@ -313,6 +314,12 @@ static char const* getFigure(scicos_block * block)
     int i__1 = 1;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -365,6 +372,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
     char *pAxe;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -409,6 +422,12 @@ static char *getGrayplot(char *pAxeUID, scicos_block * block)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedGrayplotUID != NULL)
     {
index d67ab96..bb000d0 100644 (file)
@@ -400,6 +400,7 @@ static void freeScoData(scicos_block * block)
         }
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -626,6 +627,12 @@ static char const* getFigure(scicos_block * block)
 
     int i;
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -685,6 +692,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block, int input)
     int i;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL && sco->scope.cachedAxeUID[input] != NULL)
     {
@@ -737,6 +750,12 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int input, int row
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPolylinesUIDs != NULL && sco->scope.cachedPolylinesUIDs[input] != NULL && sco->scope.cachedPolylinesUIDs[input][row] != NULL)
     {
index 3b99e2e..c246ce1 100644 (file)
@@ -339,6 +339,7 @@ static void freeScoData(scicos_block * block)
         FREE(sco->scope.cachedAxeUID);
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -526,6 +527,12 @@ static char const* getFigure(scicos_block * block)
 
     int i;
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -585,6 +592,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block, int input)
     int i;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -635,6 +648,12 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPolylinesUIDs != NULL && sco->scope.cachedPolylinesUIDs[row] != NULL)
     {
index ae94d69..2d4cda0 100644 (file)
@@ -311,6 +311,7 @@ static void freeScoData(scicos_block * block)
         FREE(sco->scope.cachedAxeUID);
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -474,6 +475,12 @@ static char const* getFigure(scicos_block * block)
     int i__1 = 1;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -530,6 +537,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
     int i;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -582,6 +595,12 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPolylinesUIDs != NULL && sco->scope.cachedPolylinesUIDs[row] != NULL)
     {
index ed58fb0..1026777 100644 (file)
@@ -314,6 +314,7 @@ static void freeScoData(scicos_block * block)
         FREE(sco->scope.cachedAxeUID);
 
         FREE(sco);
+        *(block->work) = NULL;
     }
 }
 
@@ -482,6 +483,12 @@ static char const* getFigure(scicos_block * block)
     int i__1 = 1;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedFigureUID != NULL)
     {
@@ -540,6 +547,12 @@ static char *getAxe(char const* pFigureUID, scicos_block * block)
     int i;
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedAxeUID != NULL)
     {
@@ -592,6 +605,12 @@ static char *getPolyline(char *pAxeUID, scicos_block * block, int row)
 
     sco_data *sco = (sco_data *) * (block->work);
 
+    // assert the sco is not NULL
+    if (sco == NULL)
+    {
+        return NULL;
+    }
+
     // fast path for an existing object
     if (sco->scope.cachedPolylinesUIDs != NULL && sco->scope.cachedPolylinesUIDs[row] != NULL)
     {