* Bug #14058 fixed - Scilab crashed with 'file("close", file())' instruction 36/17036/4
Charlotte HECQUET [Fri, 14 Aug 2015 14:15:04 +0000 (16:15 +0200)]
Change-Id: I509d448162250dd36a75a048af62a35b473c5b02

scilab/CHANGES_6.0.X
scilab/modules/ast/src/cpp/types/file.cpp
scilab/modules/fileio/src/cpp/filemanager.cpp
scilab/modules/io/tests/unit_tests/bug_14058.dia.ref [new file with mode: 0644]
scilab/modules/io/tests/unit_tests/bug_14058.tst [new file with mode: 0644]

index 9ef28f4..b2f8c31 100644 (file)
@@ -23,6 +23,8 @@ Scilab Bug Fixes
 
 * Bug #14049 fixed - genlib hangs if an unexpected endfunction occurs.
 
+* Bug #14058 fixed - Scilab crashed with 'file("close", file())' instruction
+
 
             Changes between version 5.5.2 and 6.0.0-alpha-1 of Scilab
             =========================================================
index 7334a54..4733641 100644 (file)
@@ -27,7 +27,7 @@ File::File()
     m_iSwap = 0;
     m_pstMode = L"";
     m_iFortranMode = -1; // see clunit.f
-    m_iType = 0; // 1 : fortran open   2 : c open
+    m_iType = 0; // 1 : fortran open   2 : c open   3 : std::err std::out std::in
     m_stFilename = L"";
 }
 
@@ -159,6 +159,9 @@ std::wstring File::getFileTypeAsString()
         case 2 :
             return L"C";
             break;
+        case 3 :
+            return L"STD";
+            break;
         default :
             return L"Error";
             break;
index 13af4c7..3ab42fd 100644 (file)
@@ -245,21 +245,21 @@ void FileManager::initialize()
     pErr->setFileMode(L"wb");
     pErr->setFileDesc(stderr);
     pErr->setFileSwap(0);
-    pErr->setFileType(1);
+    pErr->setFileType(3);
     pErr->setFilename(L"stderr");
 
     types::File* pIn = new types::File();
     pIn->setFileMode(L"rb");
     pIn->setFileDesc(stdin);
     pIn->setFileSwap(0);
-    pIn->setFileType(1);
+    pIn->setFileType(3);
     pIn->setFilename(L"stdin");
 
     types::File* pOut = new types::File();
     pOut->setFileMode(L"wb");
     pOut->setFileDesc(stdout);
     pOut->setFileSwap(0);
-    pOut->setFileType(1);
+    pOut->setFileType(3);
     pOut->setFilename(L"stdout");
 
     //put pErr at position 0
diff --git a/scilab/modules/io/tests/unit_tests/bug_14058.dia.ref b/scilab/modules/io/tests/unit_tests/bug_14058.dia.ref
new file mode 100644 (file)
index 0000000..3bdb901
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Charlotte Hecquet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 14058 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14058
+//
+// <-- Short Description -->
+// Scilab crashes with 'file("close", file())' instruction
+[units,typs,nams] = file();
+u = mopen(SCI+'/ACKNOWLEDGEMENTS', 'rt');
+u2 = mopen(SCI+'/CHANGES_6.0.X', 'rt');
+[units_open,typs,nams] = file();
+assert_checkequal(gsort([units, u, u2], "c", "i"), units_open);
+file("close", file());
+[units_close,typs,nams] = file();
+// Delete 1 in units because it represents bug_14058.tst file which was opened in Scilab
+ind = find(units == 1);
+units(ind) = [];
+assert_checkequal(units_close, units);
diff --git a/scilab/modules/io/tests/unit_tests/bug_14058.tst b/scilab/modules/io/tests/unit_tests/bug_14058.tst
new file mode 100644 (file)
index 0000000..93fd705
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Charlotte Hecquet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 14058 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14058
+//
+// <-- Short Description -->
+// Scilab crashes with 'file("close", file())' instruction
+
+[units,typs,nams] = file();
+u = mopen(SCI+'/ACKNOWLEDGEMENTS', 'rt');
+u2 = mopen(SCI+'/CHANGES_6.0.X', 'rt');
+[units_open,typs,nams] = file();
+assert_checkequal(gsort([units, u, u2], "c", "i"), units_open);
+file("close", file());
+[units_close,typs,nams] = file();
+// Delete 1 in units because it represents bug_14058.tst file which was opened in Scilab
+ind = find(units == 1);
+units(ind) = [];
+assert_checkequal(units_close, units);