Fixed minor memory leak.
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 31 May 2006 07:38:03 +0000 (07:38 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 31 May 2006 07:38:03 +0000 (07:38 +0000)
Character set  conversion in  value label dialog box.
Made more robust in the presence of bad alignment and measure parameters.

src/data/format.c
src/data/format.h
src/data/sys-file-reader.c
src/libpspp/i18n.c
src/ui/gui/menu-actions.c
src/ui/gui/psppire-var-store.c
src/ui/gui/val-labs-dialog.c
src/ui/gui/var-sheet.c
src/ui/gui/var-sheet.h

index 5b9b76569d2ad2611526302391ef60764cc76141..7066c053f5867ec0e7d2a6e89bf498e38793f731 100644 (file)
@@ -372,3 +372,20 @@ make_output_format (int type, int w, int d)
   assert (check_output_specifier (&f, 0));
   return f;
 }
+
+
+bool 
+measure_is_valid(enum measure m)
+{
+  if ( m <= 0 ) return false;
+  if ( m >= n_MEASURES) false;
+  return true;
+}
+
+bool 
+alignment_is_valid(enum alignment a)
+{
+  if ( a < 0 ) return false;
+  if ( a >= n_ALIGN) return false;
+  return true;
+}
index 9a7179129e684eabd62c05236de73476872fbf75..10ae543ead88d96bb41147f5fe153852341289f1 100644 (file)
@@ -76,7 +76,8 @@ enum alignment
   {
     ALIGN_LEFT = 0,
     ALIGN_RIGHT = 1,
-    ALIGN_CENTRE = 2
+    ALIGN_CENTRE = 2, 
+    n_ALIGN
   };
 
 
@@ -84,9 +85,12 @@ enum measure
   {
     MEASURE_NOMINAL=1,
     MEASURE_ORDINAL=2,
-    MEASURE_SCALE=3
+    MEASURE_SCALE=3,
+    n_MEASURES
   };
 
+bool measure_is_valid(enum measure m);
+bool alignment_is_valid(enum alignment a);
 
 
 /* Descriptions of all the display formats above. */
index 89a236d5393561994125fc37953275b573c1e72c..b5fa621220db6e1358cfbac663cb6e2d546ab353 100644 (file)
@@ -510,6 +510,16 @@ sfm_open_reader (struct file_handle *fh, struct dictionary **dict,
 
                      assertive_buf_read (r, &params, sizeof(params), 0);
 
+                     if ( ! measure_is_valid(params.measure) 
+                          || 
+                          ! alignment_is_valid(params.align))
+                       {
+                         msg(MW, 
+                             _("Invalid variable display parameters.  Default parameters substituted."), 
+                             fh_get_file_name(r->fh));
+                         continue;
+                       }
+
                      v = dict_get_var(*dict, i);
 
                      v->measure = params.measure;
index bcac52cf58b35b062aa6a45503887d84cc68c780..360c9abd3145ca6cc64a66996bfe309d164fa624 100644 (file)
@@ -54,6 +54,9 @@ recode_string(enum conv_id how,  const char *text, int length)
   /* FIXME: Need to ensure that this char is valid in the target encoding */
   const char fallbackchar = '?';
 
+  if ( text == NULL ) 
+    return NULL;
+
   if ( length == -1 ) 
      length = strlen(text);
 
@@ -71,8 +74,6 @@ recode_string(enum conv_id how,  const char *text, int length)
   inbytes = length;
   
   do {
-
-  
     result = iconv(convertor[how], &ip, &inbytes, 
                   &op, &outbytes);
 
@@ -108,11 +109,17 @@ recode_string(enum conv_id how,  const char *text, int length)
          }
 
       }
-
   } while ( -1 == result );
 
+  if (outbytes == 0 ) 
+    {
+      char *const oldaddr = outbuf;
+      outbuf = xrealloc(outbuf, outbufferlength + 1);
+      
+      op += (outbuf - oldaddr) ;
+    }
+
   *op = '\0';
-  
 
   return outbuf;
 }
index f031ea7030e5a1b75f2898c752a9db36678c1a14..c23beb49a872c5d02c55ec007384a4fd038045ed 100644 (file)
@@ -71,6 +71,8 @@ psppire_set_window_title(const gchar *text)
   gchar *title = g_strdup_printf("%s --- %s", text, gettext(window_title));
 
   gtk_window_set_title(GTK_WINDOW(data_editor), title);
+
+  g_free(title);
 }
 
 
index 9abf8653594ac5b49f34bea03a9c8a19d06f9e9b..4cdc295886009a7961b2832daf7f2d02ee12a338 100644 (file)
@@ -617,14 +617,21 @@ text_for_column(const struct PsppireVariable *pv, gint c, GError **err)
       }
       break;
     case COL_ALIGN:
-      return g_locale_to_utf8(gettext(alignments[psppire_variable_get_alignment(pv)]), 
-                                        -1, -0, 0, err);
+      {
+       const gint align = psppire_variable_get_alignment(pv);
+
+       g_assert(align < n_ALIGNMENTS);
+       return g_locale_to_utf8(gettext(alignments[align]),-1, -0, 0, err);
+      }
       break;
     case COL_MEASURE:
-      return g_locale_to_utf8(gettext(measures[psppire_variable_get_measure(pv)]), 
-                                        -1, -0, 0, err);
-      break;
+      {
+       const gint measure = psppire_variable_get_measure(pv);
 
+       g_assert(measure < n_MEASURES);
+       return g_locale_to_utf8(gettext(measures[measure]), -1, -0, 0, err);
+      }
+      break;
     }
   return 0;
 }
index c8be70b9f8a9221f9a714ecfe6df5e4f2b9e4531..a17d8e10f059101f1168d79521013d08f4a2fa97 100644 (file)
@@ -271,6 +271,7 @@ static void
 on_select_row                  (GtkTreeView *treeview,
                                gpointer data)
 {
+  gchar *labeltext;
   struct val_labs_dialog *dialog = data;
 
   struct val_lab * vl  = get_selected_tuple(dialog);
@@ -290,8 +291,10 @@ on_select_row                  (GtkTreeView *treeview,
   g_signal_handler_block(GTK_ENTRY(dialog->label_entry), 
                         dialog->change_handler_id);
 
+  labeltext = pspp_locale_to_utf8(vl->label, -1, 0);
   gtk_entry_set_text(GTK_ENTRY(dialog->label_entry),
-                    vl->label);
+                    labeltext);
+  g_free(labeltext);
 
   g_signal_handler_unblock(GTK_ENTRY(dialog->label_entry), 
                         dialog->change_handler_id);
@@ -412,21 +415,25 @@ repopulate_dialog(struct val_labs_dialog *dialog)
       vl;
       vl = val_labs_next(dialog->labs, &vli))
     {
+
       gchar *const vstr  = 
        value_to_text(vl->value, 
                      *psppire_variable_get_write_spec(dialog->pv));
 
+      gchar *labeltext = 
+       pspp_locale_to_utf8(vl->label, -1, 0);  
                                           
-      
       gchar *const text = g_strdup_printf("%s = \"%s\"",
-                                         vstr, vl->label);
+                                         vstr, labeltext);
+
+      
       gtk_list_store_append (list_store, &iter);
       gtk_list_store_set (list_store, &iter,
                           0, text, 
                          1, vl->value.f,
                          -1);
 
+      g_free(labeltext);
       g_free(text); 
       g_free(vstr);
     }
index 3fd426efdf866582c2576eb7a9e873706ddee766..5dcbf2f655fbb254836e739d3aa37fb9b697e3dd 100644 (file)
@@ -98,14 +98,14 @@ click2row(GtkWidget *w, gint row, gpointer data)
 
 
 
-const gchar *alignments[]={
+const gchar *alignments[n_ALIGNMENTS + 1]={
   N_("Left"),
   N_("Right"),
   N_("Centre"),
   0
 };
 
-const gchar *measures[]={
+const gchar *measures[n_MEASURES + 1]={
   N_("Nominal"),
   N_("Ordinal"),
   N_("Scale"),
index fda222b90ad74c3643a768a07e7cdc426a54d1ab..29df4cdb180847d7dfd10943cbddb360039ada4d 100644 (file)
@@ -50,10 +50,13 @@ GtkWidget* psppire_variable_sheet_create (gchar *widget_name,
                                          gchar *string2,
                                          gint int1, gint int2);
 
+#define n_ALIGNMENTS 3
 
-extern const gchar *alignments[];
+extern const gchar *alignments[n_ALIGNMENTS + 1];
 
-extern const gchar *measures[];
+#define n_MEASURES 3
+
+extern const gchar *measures[n_MEASURES + 1];
 
 
 #endif