Fixed a bug which caused a crash when reading non-existent files.
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 25 Feb 2005 13:14:29 +0000 (13:14 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 25 Feb 2005 13:14:29 +0000 (13:14 +0000)
src/ChangeLog
src/sfm-read.c
tests/Makefile.am
tests/bugs/get-no-file.sh [new file with mode: 0755]

index c5fd197702edfbcca437cae4b91330e8c2ca0979..f00274b7ec1fd2351b30f67ef5aeed36d088b413 100644 (file)
@@ -1,3 +1,8 @@
+Fri Feb 25 21:11:35 WST 2005 John Darrington <john@darrington.wattle.id.au>
+
+       * sfm-read.c: Fixed a buglet which caused a crash when trying
+       to read a non-existent file.
+
 Sun Feb 13 16:11:13 2005  Ben Pfaff  <blp@gnu.org>
 
        Fix Bug #11955.
index 9c0cc6d3115b1b37cc411471856e3f0ac35be844..40a366cf1e9cafa1cc408e0f6b2de035ea792eb6 100644 (file)
@@ -153,9 +153,13 @@ sfm_close_reader (struct sfm_reader *r)
 
   if (r->fh != NULL)
     fh_close (r->fh, "system file", "rs");
-  if (fn_close (handle_get_filename (r->fh), r->file) == EOF)
-    msg (ME, _("%s: Closing system file: %s."),
-         handle_get_filename (r->fh), strerror (errno));
+  
+  if ( r->file ) {
+    if (fn_close (handle_get_filename (r->fh), r->file) == EOF)
+      msg (ME, _("%s: Closing system file: %s."),
+          handle_get_filename (r->fh), strerror (errno));
+    r->file = NULL;
+  }
   free (r->vars);
   free (r->buf);
   free (r);
index f94d9b4dcb42c9bed8bb653f6bd1beb75cc70157..41769383071d233dcab35a5dd3b34d900c9e86ec 100644 (file)
@@ -55,6 +55,7 @@ TESTS = \
        bugs/double-frequency.sh \
        bugs/get.sh \
        bugs/examine-1sample.sh \
+       bugs/get-no-file.sh \
        bugs/html-frequency.sh \
        bugs/if_crash.sh \
        bugs/multipass.sh \
diff --git a/tests/bugs/get-no-file.sh b/tests/bugs/get-no-file.sh
new file mode 100755 (executable)
index 0000000..7df000f
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+# This program tests for a bug which caused a crash when 
+# GET specified a non-existent file
+
+TEMPDIR=/tmp/pspp-tst-$$
+TESTFILE=$TEMPDIR/`basename $0`.sps
+
+here=`pwd`;
+
+# ensure that top_srcdir is absolute
+cd $top_srcdir; top_srcdir=`pwd`
+
+export STAT_CONFIG_PATH=$top_srcdir/config
+
+
+cleanup()
+{
+     rm -rf $TEMPDIR
+}
+
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    cleanup;
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    cleanup;
+    exit 2;
+}
+
+pass()
+{
+    cleanup;
+    exit 0;
+}
+
+mkdir -p $TEMPDIR
+
+cd $TEMPDIR
+
+activity="create program"
+cat > $TESTFILE <<EOF
+GET /FILE='$TEMPDIR/no-file.xx'.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+
+# The command should produce a warning.  Not an error.
+# We use the stdinput here, because the bug seems to manifest itself only in 
+# interactive mode.
+activity="run program"
+cat $TESTFILE | $SUPERVISOR $here/../src/pspp -o raw-ascii  > /dev/null
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass