spreadsheet: Avoid sharing a dictionary between spreadsheet and client.
[pspp] / src / data / gnumeric-reader.c
index e0e95069b602fb38a3794ca2075d70ed50bf77b5..7033448d8b4dc23a7c63b2d967854d551e0f47d9 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013  Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009, 2010, 2011, 2012, 2013, 2016  Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -185,10 +185,15 @@ gnumeric_unref (struct spreadsheet *s)
        {
          xmlFree (r->sheets[i].name);
        }
-    
+
+
       free (r->sheets);
       state_data_destroy (&r->msd);
 
+      dict_destroy (r->dict);
+
+      free (s->file_name);
+
       free (r);
     }
 }
@@ -555,7 +560,7 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro
     {
       r = xzalloc (sizeof *r);
       r->spreadsheet.n_sheets = -1;
-      r->spreadsheet.file_name = filename;
+      r->spreadsheet.file_name = strdup (filename);
       sd = &r->msd;
     }
   else
@@ -589,8 +594,7 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro
   if ( ret != 1)
     {
       /* Does not seem to be a gnumeric file */
-      xmlFreeTextReader (sd->xtr);
-      free (r);
+      gnumeric_unref (&r->spreadsheet);
       return NULL;
     }
 
@@ -871,8 +875,6 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet,
     }
 
   free (var_spec);
-  dict_destroy (spreadsheet->dict);
-  spreadsheet->dict = NULL;
 
   gnm_file_casereader_destroy (NULL, r);