Xcos: fix for the to_workspace variable length 82/12182/3
Paul BIGNIER [Tue, 30 Jul 2013 08:32:00 +0000 (10:32 +0200)]
Linux 32 machines segfaulted whenever a to_workspace variable name exceeded seven characters.

Now, the user can pass variable names up to nineteen characters long.

Nineteen is a maximum because in tows_c.c I add six caracters to the variable name,
and 19+6 is the maximal variable length of Scilab.

Updated the test.

Change-Id: I6a85b37b994e9452f2d732521d5ef4e520b276f9

scilab/modules/scicos_blocks/macros/Sinks/TOWS_c.sci
scilab/modules/scicos_blocks/src/c/tows_c.c
scilab/modules/xcos/tests/unit_tests/tows_c.dia.ref
scilab/modules/xcos/tests/unit_tests/tows_c.tst
scilab/modules/xcos/tests/unit_tests/tows_c.xcos

index 42f6317..d9fffbc 100644 (file)
@@ -53,7 +53,7 @@ function [x, y, typ] = TOWS_c(job, arg1, arg2)
             //check for valid name variable
             r = %f;
             ierr = execstr("r = validvar(varnam)", "errcatch");
-            if ~r | ierr <> 0 then
+            if ~r | ierr <> 0 | length(varnam) > 19 then
                 message(["Invalid variable name."; "Please choose another variable name."]);
                 ok = %f;
             end
index b6d53f3..a343a58 100644 (file)
@@ -1276,7 +1276,7 @@ SCICOS_BLOCKS_IMPEXP void tows_c(scicos_block *block, int flag)
 
             /* write x */
             ptr_i = (int*) ptr->work;
-            if ((varName = scicos_malloc((varNameLen + 5) * sizeof(char))) == NULL)
+            if ((varName = scicos_malloc((varNameLen + 6) * sizeof(char))) == NULL)
             {
                 set_block_error(-16);
                 scicos_free(ptr->workt);
@@ -1284,7 +1284,7 @@ SCICOS_BLOCKS_IMPEXP void tows_c(scicos_block *block, int flag)
                 *(block->work) = NULL;
                 return;
             }
-            memset(varName, 0x0, (varNameLen + 5) * sizeof(char));
+            memset(varName, 0x0, (varNameLen + 6) * sizeof(char));
             /* save the Scilab name into varName */
             for (i = 0; i < varNameLen; ++i)
             {
index 1ecd496..2d50715 100644 (file)
@@ -8,7 +8,7 @@
 // <-- XCOS TEST -->
 // Import diagram
 assert_checktrue(importXcosDiagram("SCI/modules/xcos/tests/unit_tests/tows_c.xcos"));
-Info = scicos_simulate(scs_m, 'nw');
+Info = scicos_simulate(scs_m);
 // Reference values
 t = (2.2 : 0.1 : 14.9)';
 A_ref = struct('values', sin(t), 'time', t); // A_ref = (sin(t), t)
@@ -26,9 +26,10 @@ shortV_ref(:, 2) = shortV_ref(:, 2) + 1; // shortV_ref = [7, 8] with 128 rows
 charV_ref = int8(ones(128, 2));
 charV_ref = 9*charV_ref;
 charV_ref(:, 2) = charV_ref(:, 2) + 1;   // charV_ref = [9, 10] with 128 rows
-intM2_ref = int32([11 12 ; 13 14]); // intM2_ref is an element of hypermatrix intM2
-shortM_ref = int16([15 16; 17 18]); // shortM_ref is an element of hypermatrix shortM
-charM_ref = int8([19 20 ; 21 22]);  // charM_ref is an element of hypermatrix charM
+intM2_ref = int32([11 12 ; 13 14]);      // intM2_ref is an element of hypermatrix intM2
+shortM_ref = int16([15 16; 17 18]);      // shortM_ref is an element of hypermatrix shortM
+charM_ref = int8([19 20 ; 21 22]);       // charM_ref is an element of hypermatrix charM
+nineteen_ref = struct('values', ones(128,1), 'time', t);  // Checks that a ninteteen characters variable name is possible, with correct time values
 // Run simulation with scicos_simulate() + check results
 try scicos_simulate(scs_m, Info); catch disp(lasterror()); end  // Run simulation
 assert_checkequal(fieldnames(A), fieldnames(A_ref)); // Check A fields
@@ -50,6 +51,8 @@ for i = 1:128
     assert_checktrue(and(shortM.values(:, :, i) == shortM_ref));
     assert_checktrue(and(charM.values(:, :, i)  == charM_ref));
 end
+assert_checkalmostequal(nineteen19Letters19.values, nineteen_ref.values);
+assert_checkalmostequal(nineteen19Letters19.time, nineteen_ref.time);
 // Run simulation with xcos_simulate() + check results
 try xcos_simulate(scs_m, 4); catch disp(lasterror()); end  // Run simulation
 assert_checkequal(fieldnames(A), fieldnames(A_ref)); // Check A fields
@@ -71,6 +74,8 @@ for i = 1:128
     assert_checktrue(and(shortM.values(:, :, i) == shortM_ref));
     assert_checktrue(and(charM.values(:, :, i)  == charM_ref));
 end
+assert_checkalmostequal(nineteen19Letters19.values, nineteen_ref.values);
+assert_checkalmostequal(nineteen19Letters19.time, nineteen_ref.time);
 // Type checks
 assert_checkequal(type(A.values), 1);              // A takes real numbers
 assert_checkequal(type(imgV.values(1)), 1);       // imgV takes complex numbers
index 9f18dd6..91476c8 100644 (file)
@@ -10,7 +10,7 @@
 
 // Import diagram
 assert_checktrue(importXcosDiagram("SCI/modules/xcos/tests/unit_tests/tows_c.xcos"));
-Info = scicos_simulate(scs_m, 'nw');
+Info = scicos_simulate(scs_m);
 
 // Reference values
 t = (2.2 : 0.1 : 14.9)';
@@ -29,9 +29,10 @@ shortV_ref(:, 2) = shortV_ref(:, 2) + 1; // shortV_ref = [7, 8] with 128 rows
 charV_ref = int8(ones(128, 2));
 charV_ref = 9*charV_ref;
 charV_ref(:, 2) = charV_ref(:, 2) + 1;   // charV_ref = [9, 10] with 128 rows
-intM2_ref = int32([11 12 ; 13 14]); // intM2_ref is an element of hypermatrix intM2
-shortM_ref = int16([15 16; 17 18]); // shortM_ref is an element of hypermatrix shortM
-charM_ref = int8([19 20 ; 21 22]);  // charM_ref is an element of hypermatrix charM
+intM2_ref = int32([11 12 ; 13 14]);      // intM2_ref is an element of hypermatrix intM2
+shortM_ref = int16([15 16; 17 18]);      // shortM_ref is an element of hypermatrix shortM
+charM_ref = int8([19 20 ; 21 22]);       // charM_ref is an element of hypermatrix charM
+nineteen_ref = struct('values', ones(128,1), 'time', t);  // Checks that a ninteteen characters variable name is possible, with correct time values
 
 // Run simulation with scicos_simulate() + check results
 try scicos_simulate(scs_m, Info); catch disp(lasterror()); end  // Run simulation
@@ -55,6 +56,8 @@ for i = 1:128
     assert_checktrue(and(shortM.values(:, :, i) == shortM_ref));
     assert_checktrue(and(charM.values(:, :, i)  == charM_ref));
 end
+assert_checkalmostequal(nineteen19Letters19.values, nineteen_ref.values);
+assert_checkalmostequal(nineteen19Letters19.time, nineteen_ref.time);
 
 // Run simulation with xcos_simulate() + check results
 try xcos_simulate(scs_m, 4); catch disp(lasterror()); end  // Run simulation
@@ -78,6 +81,8 @@ for i = 1:128
     assert_checktrue(and(shortM.values(:, :, i) == shortM_ref));
     assert_checktrue(and(charM.values(:, :, i)  == charM_ref));
 end
+assert_checkalmostequal(nineteen19Letters19.values, nineteen_ref.values);
+assert_checkalmostequal(nineteen19Letters19.time, nineteen_ref.time);
 
 // Type checks
 assert_checkequal(type(A.values), 1);              // A takes real numbers
index 008f6b5..6555804 100644 (file)
Binary files a/scilab/modules/xcos/tests/unit_tests/tows_c.xcos and b/scilab/modules/xcos/tests/unit_tests/tows_c.xcos differ