Don't ref or unref the inline file handle.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 20 Jun 2020 05:17:06 +0000 (07:17 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 20 Jun 2020 05:17:03 +0000 (07:17 +0200)
The special file handle 'inline_file' is a singleton.  It should not
be reffed, or unreffed.   Doing so causes a crash.

Reported by Andrea Fioraldi.

Fixes bug #58601

src/data/file-handle-def.c
tests/data/file.at

index 1296a5b171ab342b9985d47d8c04ef6dff21d021..716a029cc701a567d4c28c53ab0119fed66d003f 100644 (file)
@@ -115,12 +115,17 @@ fh_done (void)
   HMAP_FOR_EACH_SAFE (handle, next,
                       struct file_handle, name_node, &named_handles)
     unname_handle (handle);
+
+  free_handle (inline_file);
 }
 
 /* Free HANDLE and remove it from the global list. */
 static void
 free_handle (struct file_handle *handle)
 {
+  if (handle == NULL)
+    return;
+
   /* Remove handle from global list. */
   if (handle->id != NULL)
     hmap_delete (&named_handles, &handle->name_node);
@@ -153,6 +158,8 @@ unname_handle (struct file_handle *handle)
 struct file_handle *
 fh_ref (struct file_handle *handle)
 {
+  if (handle == fh_inline_file ())
+    return handle;
   assert (handle->ref_cnt > 0);
   handle->ref_cnt++;
   return handle;
@@ -165,6 +172,8 @@ fh_unref (struct file_handle *handle)
 {
   if (handle != NULL)
     {
+      if (handle == fh_inline_file ())
+        return;
       assert (handle->ref_cnt > 0);
       if (--handle->ref_cnt == 0)
         free_handle (handle);
index 6fcbe579aae3ece1afcdf29c9a2c105a5a56cd6d..d3013d7501ab2be6efc16698de34b96bc81b0a80 100644 (file)
@@ -120,3 +120,21 @@ x,y
 ])
 
 AT_CLEANUP
+
+
+dnl This was seen to crash pspp
+AT_SETUP([Reusing inline file])
+
+AT_DATA([inline-reuse.sps], [dnl
+get data /type=txt /file=inline  /variables=A f7.2 .
+
+data list notable list /foo.
+begin data.
+end data.
+
+data list notable list /foo.
+])
+
+AT_CHECK([pspp inline-reuse.sps], [0], [ignore])
+
+AT_CLEANUP