* Bug 15170 fixed: getd() created and returned a parasitic variable k 75/19275/4
Samuel GOUGEON [Fri, 26 May 2017 15:49:01 +0000 (17:49 +0200)]
  http://bugzilla.scilab.org/15170

Change-Id: I69dc38a81ed2990e3ea528231f4b0c0175b57a64

scilab/CHANGES.md
scilab/modules/functions/macros/getd.sci
scilab/modules/functions/tests/nonreg_tests/bug_15170.tst [new file with mode: 0644]

index 027dde2..d7b0347 100644 (file)
@@ -416,6 +416,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#15138](http://bugzilla.scilab.org/show_bug.cgi?id=15138): Scilab crashes at start on Windows
 * [#15139](http://bugzilla.scilab.org/show_bug.cgi?id=15139): Fix return in try/catch expression
 * [#15144](http://bugzilla.scilab.org/show_bug.cgi?id=15144): `mean` and `stdev` could not be overloaded.
+* [#15170](http://bugzilla.scilab.org/show_bug.cgi?id=15170): `getd` created and returned a variable `k` that could overwrite a loaded one.
 * [#15184](http://bugzilla.scilab.org/show_bug.cgi?id=15184): error management when calling operator overload fixed.
 * [#15185](http://bugzilla.scilab.org/show_bug.cgi?id=15185): "Region to Superblock" did not restore broken links.
 * [#15188](http://bugzilla.scilab.org/show_bug.cgi?id=15188): Failed to load hdf5_is_file function.
index fed76da..c04b08c 100644 (file)
@@ -1,7 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA
 // Copyright (C) ENPC
-// Copyright (C) 2016 - Samuel GOUGEON
+// Copyright (C) 2016, 2017 - Samuel GOUGEON
+//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
@@ -53,15 +54,16 @@ function getd(path,option)
     //  to be returned.
     //  Informations to be protected are set in global variables: lst, old
     global old          // sets it as global, before first assignment
+    k_getd_loop = 0;
     old = who("local")
     old = old(isdef(old, "l"))
     //prot = funcprot(); funcprot(0)
-    for k = 1:size(lst,"*");
+    for k_getd_loop = 1:size(lst,"*");
         global lst // recover it whenever it would have been cleared
-        if fileparts(lst(k),"extension")==".sci" then
+        if fileparts(lst(k_getd_loop),"extension")==".sci" then
             // disp(basename(lst(k))) // Beware: files are not sorted/loaded in alphabetical order
-            if execstr("exec(lst(k));","errcatch")<>0 then
-                warning(msprintf(gettext("%s: Incorrect function in file %s.\n"),"getd",lst(k)))
+            if execstr("exec(lst(k_getd_loop));","errcatch")<>0 then
+                warning(msprintf(gettext("%s: Incorrect function in file %s.\n"),"getd",lst(k_getd_loop)))
             end
         end
     end
diff --git a/scilab/modules/functions/tests/nonreg_tests/bug_15170.tst b/scilab/modules/functions/tests/nonreg_tests/bug_15170.tst
new file mode 100644 (file)
index 0000000..d9c2c37
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15170 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15170
+//
+// <-- Short Description -->
+// getd() generated a variable k that could overwrite a loaded one.
+
+d = TMPDIR+"\getd_tmp";
+mkdir(d);
+f = [
+"function r = test_getd()"
+" r = 1;"
+"endfunction"
+"k = %pi;"
+];
+mputl(f, d+"\test_getd.sci");
+getd(d);
+assert_checktrue(isdef("test_getd","l"));
+assert_checkfalse(isdef("k_getd_loop","l"));
+assert_checktrue(isdef("k","l"));
+assert_checkequal(k, %pi);
+rmdir(d,"s");