<div dir="ltr"><div><br></div><div>For review by anyone:<br></div><div><br></div><div>Branches: master, 13.05</div><div><br></div><div>The original test case for this bug is quite difficult to integrate into</div><div>the test suite as it effectively closes the standard output stream.  I</div>
<div>will commit a test case for this separately as the one I have seems to</div><div>be triggering other problems on Linux.</div><div><br></div><div>-----------------------</div><div><br></div><div>Fix bug #161.</div><div>
<br></div><div>In C grades, closing a file stream multiple times can lead to a segmentation</div><div>fault on some systems (e.g. Linux), whereas on others (e.g. Mac OS X) an</div><div>io.error exception is thrown.  (The difference is due to differences in the</div>
<div>semantics of fclose.)  Try to avoid the former case by checking that the</div><div>stream handle is non-NULL before we attempt to close it.  (mercury_close zeros</div><div>out the relevant bits of the MercuryFile structure when we close a stream so,</div>
<div>the stream handle is set to NULL the first time we close the stream.)</div><div><br></div><div>library/io.m:</div><div> <span class="" style="white-space:pre">  </span>As above.</div><div><br></div><div>Julien.</div><div>
<br></div><div>diff --git a/library/io.m b/library/io.m</div><div>index 8a462f4..ef77bed 100644</div><div>--- a/library/io.m</div><div>+++ b/library/io.m</div><div>@@ -7342,6 +7342,16 @@ static const MercuryFile MR_closed_stream = {</div>
<div>  void</div><div>  mercury_close(MercuryFilePtr mf)</div><div>  {</div><div>+    /*</div><div>+    ** On some systems attempting to close a file stream that has been</div><div>+    ** previously closed will lead to a segmentation fault.  We check</div>
<div>+    ** that we have not previously closed the file stream here so we</div><div>+    ** can give the user some idea about what has happened.</div><div>+    */</div><div>+    if (MR_file(*mf) == NULL) {</div><div>+        mercury_io_error(mf, ""error closing file: invalid file stream"");</div>
<div>+    }</div><div>+</div><div>      if (MR_CLOSE(*mf) < 0) {</div><div>          mercury_io_error(mf, ""error closing file: %s"", strerror(errno));</div><div>      }</div><div><br></div></div>