* [Bug #14714] fixed - Crash/Leak when deleting datatip 49/18449/3
Caio SOUZA [Thu, 11 Aug 2016 15:58:51 +0000 (12:58 -0300)]
Change-Id: Ia06421037b39e2e81939e2f7966644195005a7d8

scilab/CHANGES.md
scilab/modules/graphic_objects/src/java/org/scilab/modules/graphic_objects/graphicController/GraphicController.java
scilab/modules/gui/sci_gateway/cpp/sci_datatipremove.cpp
scilab/modules/hdf5/src/cpp/handle_properties.cpp

index 51adef7..7d89187 100644 (file)
@@ -283,6 +283,7 @@ Bug Fixes
 * [Bug #14690](http://bugzilla.scilab.org/show_bug.cgi?id=14690) fixed - The user's startup files set in the working directory were not executed. When `SCIHOME` is not the working directory, `SCIHOME\scilab.ini` was executed twice.
 * [Bug #14694](http://bugzilla.scilab.org/show_bug.cgi?id=14694) fixed - The list of named colors was misaligned and poorly rendered in `help color_list``SCIHOME\scilab.ini` was executed twice.
 * [Bug #14710](http://bugzilla.scilab.org/show_bug.cgi?id=14710) fixed - fullpath(TMPDIR+...) was bugged on MacOS
+* [Bug #14714](http://bugzilla.scilab.org/show_bug.cgi?id=14714) fixed - Crash/Leak when deleting datatip
 
 ### In 6.0.0 beta-2 and earlier:
 
index d2a91be..983ab69 100644 (file)
@@ -26,6 +26,7 @@ import org.scilab.modules.graphic_objects.graphicModel.GraphicModel;
 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject;
 import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
 import org.scilab.modules.graphic_objects.graphicObject.GraphicObject.Type;
+import org.scilab.modules.graphic_objects.polyline.Polyline;
 import org.scilab.modules.graphic_objects.graphicView.FlattenTreeView;
 import org.scilab.modules.graphic_objects.graphicView.GedTreeView;
 import org.scilab.modules.graphic_objects.graphicView.GraphicView;
@@ -382,12 +383,21 @@ public class GraphicController {
      * @param id deleted object identifier.
      */
     public void removeRelationShipAndDelete(Integer id) {
+
         final GraphicObject killMe = getObjectFromId(id);
         // assert that the object has not been deleted yet
         if (killMe == null) {
             return;
         }
 
+        //Datatips are not listed as "children", then they must be deleted separately
+        if (killMe.getType() == GraphicObjectProperties.__GO_POLYLINE__) {
+            Integer[] datatips = ((Polyline)killMe).getDatatips();
+            for (Integer datatip : datatips) {
+                deleteObject(datatip);
+            }
+        }
+
         Integer parentUID = killMe.getParent();
 
 
index 8d9cba9..5093258 100644 (file)
@@ -48,6 +48,8 @@ int sci_datatipremove(char *fname, void* pvApiCtx)
     int nbCol           = 0;
     int iType           = 0;
     int *piType         = &iType;
+    int iDatatipCount   = 0;
+    int *piDatatipCount = &iDatatipCount;
 
     SciErr sciErr;
     CheckInputArgument(pvApiCtx, 1, 2);
@@ -122,7 +124,16 @@ int sci_datatipremove(char *fname, void* pvApiCtx)
                     if (nbRow * nbCol == 1)
                     {
                         indexPos = (int) pdblReal[0];
-                        DatatipDelete::datatipRemoveProgramIndex(getScilabJavaVM(), iPolylineUID, indexPos);
+                        getGraphicObjectProperty(iPolylineUID, __GO_DATATIPS_COUNT__, jni_int, (void**) &piDatatipCount);
+                        if (indexPos > 0 && indexPos <= iDatatipCount)
+                        {
+                            DatatipDelete::datatipRemoveProgramIndex(getScilabJavaVM(), iPolylineUID, indexPos);
+                        }
+                        else
+                        {
+                            Scierror(999, _("%s: Invalid value for datatip index %d.\n"), fname, indexPos);
+                            return 1;
+                        }
 
                     }
                     else
index 61da7a2..bbd25bd 100644 (file)
@@ -347,7 +347,7 @@ static int import_handle_generic(int dataset, int uid, int parent, const HandleP
         import_handle_children(dataset, uid);
     }
 
-    for (auto& prop : props)
+    for (auto & prop : props)
     {
         const char* name = prop.first.data();
         std::vector<int> info(prop.second);
@@ -1182,7 +1182,7 @@ static int import_handle_datatip(int dataset, int parent)
     setGraphicObjectProperty(datatip, __GO_DATATIP_INDEXES__, indexes, jni_double_vector, 2);
 
     //import "standards" properties
-    import_handle_generic(dataset, datatip, parent, DatatipHandle::getPropertyList(), true);
+    import_handle_generic(dataset, datatip, -1, DatatipHandle::getPropertyList(), true);
 
     closeList6(dataset);
     return datatip;
@@ -1733,7 +1733,7 @@ void update_link_path(int legend, Links::PathList& paths)
     getGraphicObjectProperty(legend, __GO_PARENT_AXES__, jni_int, (void**)&paxes);
     std::vector<int> links;
     //loop on child following path index
-    for (auto& path : paths)
+    for (auto & path : paths)
     {
         int current = axes;
         for (int j = 0; j < path.size(); ++j)
@@ -1842,7 +1842,7 @@ static bool export_handle_children(int parent, int uid);
 
 static bool export_handle_generic(int parent, int uid, const HandleProp& props)
 {
-    for (auto& prop : props)
+    for (auto & prop : props)
     {
         const char* name = prop.first.data();
         std::vector<int> info(prop.second);