Gnumeric Reader: Fix memory leak
[pspp] / src / data / gnumeric-reader.c
index 07c1814f8e4c2c7b349332b3abf021477824464e..0783e10f7c1b33452222b82238d95d51ae582004 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "spreadsheet-reader.h"
 
-#if !GNM_SUPPORT
+#if !GNM_READ_SUPPORT
 
 struct casereader *
 gnumeric_open_reader (const struct spreadsheet_read_options *opts, struct dictionary **dict)
@@ -149,7 +149,6 @@ state_data_destroy (struct state_data *sd)
 struct gnumeric_reader
 {
   struct spreadsheet spreadsheet;
-  int ref_cnt;
 
   struct state_data rsd;
   struct state_data msd;
@@ -174,11 +173,11 @@ struct gnumeric_reader
 
 
 void
-gnumeric_destroy (struct spreadsheet *s)
+gnumeric_unref (struct spreadsheet *s)
 {
   struct gnumeric_reader *r = (struct gnumeric_reader *) s;
 
-  if (0 == --r->ref_cnt)
+  if (0 == --s->ref_cnt)
     {
       int i;
 
@@ -190,6 +189,8 @@ gnumeric_destroy (struct spreadsheet *s)
       free (r->sheets);
       state_data_destroy (&r->msd);
 
+      free (s->file_name);
+
       free (r);
     }
 }
@@ -250,7 +251,7 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
   if (r->proto) 
     caseproto_unref (r->proto);
 
-  gnumeric_destroy (&r->spreadsheet);
+  gnumeric_unref (&r->spreadsheet);
 }
 
 
@@ -556,7 +557,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
@@ -573,7 +574,8 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro
   sd->row = sd->col = -1;
   sd->state = STATE_PRE_INIT;
   sd->xtr = xtr;
-  r->ref_cnt++;
+  r->spreadsheet.ref_cnt++;
+
 
   /* Advance to the start of the workbook.
      This gives us some confidence that we are actually dealing with a gnumeric
@@ -589,8 +591,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;
     }
 
@@ -953,4 +954,4 @@ gnm_file_casereader_read (struct casereader *reader UNUSED, void *r_)
 }
 
 
-#endif /* GNM_SUPPORT */
+#endif /* GNM_READ_SUPPORT */