* Bug 15812 fixed: source may become corrupted after insertion 64/20964/7
St├ęphane MOTTELET [Mon, 29 Apr 2019 09:05:31 +0000 (11:05 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=15812

Change-Id: Ic10a138aa5fb2213a2ba68125f5b3f1fb4ba4282

scilab/CHANGES.md
scilab/modules/ast/src/cpp/types/arrayof.cpp
scilab/modules/ast/tests/nonreg_tests/bug_15812.tst [new file with mode: 0644]

index 7b6a3ff..e9d69f5 100644 (file)
@@ -148,6 +148,7 @@ Bug Fixes
 * [#15425](http://bugzilla.scilab.org/show_bug.cgi?id=15425): The Kronecker product `a.*.b` failed when `a` or `b` or both are hypermatrices, with one or both being polynomials or rationals.
 * [#15523](http://bugzilla.scilab.org/show_bug.cgi?id=15523): `%ODEOPTIONS(1)=2` didn't work with solvers 'rk' and 'rkf' 
 * [#15577](http://bugzilla.scilab.org/show_bug.cgi?id=15577): `edit` did not accept a line number as text, as with `edit linspace 21`.
+* [#15812](http://bugzilla.scilab.org/show_bug.cgi?id=15812): On assigning variables the source variable may become become corrupted
 * [#15983](http://bugzilla.scilab.org/show_bug.cgi?id=15983): `group()` regressed in 5.5.2 due to a too intrusive fix.
 * [#15995](http://bugzilla.scilab.org/show_bug.cgi?id=15995): patch was missing in surface plot (regression)
 * [#16005](http://bugzilla.scilab.org/show_bug.cgi?id=16005): The `intdec` example was biased and not robust when changing sampling frequencies.
index ee296d5..dd5c266 100644 (file)
@@ -601,7 +601,6 @@ GenericType* ArrayOf<T>::insertNew(typed_list* _pArgs)
     if (iSeqCount < 0)
     {
         //manage : and $ in creation by insertion
-        int *piSourceDims = getDimsArray();
         int iSourceDims = getDims();
         int iSource = 0;
         int iNbColon = 0;
@@ -623,6 +622,9 @@ GenericType* ArrayOf<T>::insertNew(typed_list* _pArgs)
             return this;
         }
 
+        int *piSourceDims = new int[iSourceDims];
+        memcpy(piSourceDims, getDimsArray(), iSourceDims * sizeof(int));
+
         if (iNbColon == 1 && isVector())
         {
             iSourceDims = 1;
@@ -672,6 +674,7 @@ GenericType* ArrayOf<T>::insertNew(typed_list* _pArgs)
                 ++iSource;
             }
         }
+        delete[] piSourceDims;
     }
 
     //remove last dimension at size 1
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_15812.tst b/scilab/modules/ast/tests/nonreg_tests/bug_15812.tst
new file mode 100644 (file)
index 0000000..bfad873
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15812 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15812
+//
+// <-- Short Description -->
+// On assigning variables the source variable becomes corrupted (e.g. x=[3 4 5];y(1,:)=x;)
+u=[3 4 5];
+clear v
+v(1,:)=u;
+assert_checkequal(size(u),[1,3])
+