From e63296a3c2bfcf1b40d712e79f17b349c4a6f21d Mon Sep 17 00:00:00 2001
From: Ben Pfaff <blp@cs.stanford.edu>
Date: Sat, 16 Apr 2011 11:20:59 -0700
Subject: [PATCH] gui: Fix crash in executor when inline data is missing.

Without this commit, typing "DATA LIST /x 1." into an otherwise empty
syntax window and executing it caused a crash because the lexer was
being accessed after it was destroyed.  This commit averts the crash.
---
 src/ui/gui/executor.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/ui/gui/executor.c b/src/ui/gui/executor.c
index 6377107c..123000fe 100644
--- a/src/ui/gui/executor.c
+++ b/src/ui/gui/executor.c
@@ -90,9 +90,6 @@ execute_syntax (struct lex_reader *lex_reader)
 	break;
     }
 
-  lex_destroy (lexer);
-  psppire_set_lexer (NULL);
-
   proc_execute (the_dataset);
 
   psppire_dict_replace_dictionary (the_data_store->dict,
@@ -102,6 +99,13 @@ execute_syntax (struct lex_reader *lex_reader)
   if (!lazy_casereader_destroy (reader, lazy_serial))
     psppire_data_store_set_reader (the_data_store, reader);
 
+  /* Destroy the lexer only after obtaining the dataset, because the dataset
+     might depend on the lexer, if the casereader specifies inline data.  (In
+     such a case then we'll always get an error message--the inline data is
+     missing, otherwise it would have been parsed in the loop above.) */
+  lex_destroy (lexer);
+  psppire_set_lexer (NULL);
+
   output_flush ();
 
   return retval;
-- 
2.30.2